/ Hex Artifact Content
Login

Artifact d0111c10f4e8917fc9a8b0c3b7b98e1f200122682107cceb840bcbdd96da2b90:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1fc0: 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
1fd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1fe0: 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
1ff0: 20 75 73 65 73 20 66 72 65 65 2d 6c 69 73 74 20   uses free-list 
2000: 66 6f 72 6d 61 74 20 32 2e 20 4f 72 20 66 61 6c  format 2. Or fal
2010: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
2020: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2030: 65 46 72 65 65 6c 69 73 74 46 6f 72 6d 61 74 32  eFreelistFormat2
2040: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
2050: 0a 20 20 72 65 74 75 72 6e 20 28 70 42 74 2d 3e  .  return (pBt->
2060: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 38  pPage1->aData[18
2070: 5d 20 3e 20 32 29 3b 0a 7d 0a 23 65 6e 64 69 66  ] > 2);.}.#endif
2080: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
2090: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20a0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20b0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20c0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20d0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20e0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
20f0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2100: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2110: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2120: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2130: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2140: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2150: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2160: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2170: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2180: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
2190: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21a0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21b0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21c0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21d0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21e0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
21f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2200: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2210: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2220: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2230: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2240: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2250: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2260: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2270: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2280: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c 65 4c  eadUncommit)||eL
2290: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c  ock==WRITE_LOCK|
22a0: 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20  |iTab==1 );.  . 
22b0: 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e   /* If requestin
22c0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  g a write-lock, 
22d0: 74 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d  then the Btree m
22e0: 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e  ust have an open
22f0: 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e   write.  ** tran
2300: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20  saction on this 
2310: 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f  file. And, obvio
2320: 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74  usly, for this t
2330: 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20  o be so there . 
2340: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f   ** must be an o
2350: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
2360: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c  ction on the fil
2370: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
2380: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2390: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d  READ_LOCK || (p=
23a0: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26  =pBt->pWriter &&
23b0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
23c0: 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61  NS_WRITE) );.  a
23d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23e0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e  AD_LOCK || pBt->
23f0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
2400: 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
2410: 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2420: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ne is a no-op if
2430: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
2440: 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  e is not enabled
2450: 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   */.  if( !p->sh
2460: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65  arable ){.    re
2470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2480: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d    }..  /* If som
2490: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
24a0: 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  on is holding an
24b0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
24c0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73   the.  ** reques
24d0: 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74  ted lock may not
24e0: 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20   be obtained..  
24f0: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  */.  if( pBt->pW
2500: 72 69 74 65 72 21 3d 70 20 26 26 20 28 70 42 74  riter!=p && (pBt
2510: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
2520: 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
2530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
2540: 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
2550: 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74  ->db, pBt->pWrit
2560: 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  er->db);.    ret
2570: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2580: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2590: 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d   }..  for(pIter=
25a0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
25b0: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
25c0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54  pNext){.    /* T
25d0: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49  he condition (pI
25e0: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
25f0: 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k) in the follow
2600: 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20  ing if(...) .   
2610: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73   ** statement is
2620: 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f   a simplificatio
2630: 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  n of:.    **.   
2640: 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52   **   (eLock==WR
2650: 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  ITE_LOCK || pIte
2660: 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  r->eLock==WRITE_
2670: 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20  LOCK).    **.   
2680: 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f   ** since we kno
2690: 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d  w that if eLock=
26a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65  =WRITE_LOCK, the
26b0: 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  n no other conne
26c0: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79  ction.    ** may
26d0: 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f   hold a WRITE_LO
26e0: 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20  CK on any table 
26f0: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69  in this file (si
2700: 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20  nce there can.  
2710: 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73    ** only be a s
2720: 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20  ingle writer).. 
2730: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
2740: 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  ( pIter->eLock==
2750: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74  READ_LOCK || pIt
2760: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45  er->eLock==WRITE
2770: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
2780: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2790: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
27a0: 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74  pBtree==p || pIt
27b0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
27c0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 70  LOCK);.    if( p
27d0: 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
27e0: 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  && pIter->iTable
27f0: 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65 72 2d  ==iTab && pIter-
2800: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b  >eLock!=eLock ){
2810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
2820: 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
2830: 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42  p->db, pIter->pB
2840: 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  tree->db);.     
2850: 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54   if( eLock==WRIT
2860: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
2870: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74    assert( p==pBt
2880: 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
2890: 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
28a0: 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e  gs |= BTS_PENDIN
28b0: 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  G;.      }.     
28c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
28d0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
28e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  E;.    }.  }.  r
28f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2900: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
2910: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2920: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
2930: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2940: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
2950: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
2960: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2970: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
2980: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
2990: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
29a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
29b0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
29c0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
29d0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
29e0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
29f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2a00: 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f  ssumes the follo
2a10: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61  wing:.**.**   (a
2a20: 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ) The specified 
2a30: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69  Btree object p i
2a40: 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
2a50: 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20   sharable.**    
2a60: 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65     database (one
2a70: 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72   with the BtShar
2a80: 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67  ed.sharable flag
2a90: 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a   set), and.**.**
2aa0: 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20     (b) No other 
2ab0: 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f  Btree objects ho
2ac0: 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ld a lock that c
2ad0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
2ae0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
2af0: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
2b00: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2b10: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2b20: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2b30: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2b40: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2b50: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2b60: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2b70: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2b80: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
2b90: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
2ba0: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
2bb0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
2bc0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
2bd0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
2be0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2bf0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2c00: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
2c10: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2c20: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2c30: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2c40: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2c50: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2c60: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2c70: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2c80: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2c90: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2ca0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2cb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2cc0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
2cd0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
2ce0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
2cf0: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
2d00: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
2d10: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2d20: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2d30: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2d40: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2d50: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2d60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2d70: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2d80: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
2d90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
2da0: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
2db0: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
2dc0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
2dd0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
2de0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2df0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2e00: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20 7c 7c  ReadUncommit) ||
2e10: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2e20: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
2e30: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
2e40: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2e50: 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d  on a sharable b-
2e60: 74 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20  tree after it . 
2e70: 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74   ** has been det
2e80: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
2e90: 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c  other b-tree hol
2ea0: 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67  ds a conflicting
2eb0: 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
2ec0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
2ed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
2ee0: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68  LITE_OK==querySh
2ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2f00: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
2f10: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ock) );..  /* Fi
2f20: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
2f30: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
2f40: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
2f50: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
2f60: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
2f70: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
2f80: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
2f90: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
2fa0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
2fb0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2fc0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
2fd0: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
2fe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2ff0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
3000: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
3010: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
3020: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
3030: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
3040: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
3050: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
3060: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
3070: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
3080: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
3090: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
30a0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
30b0: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
30c0: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
30d0: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
30e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
30f0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
3100: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  .    pLock->iTab
3110: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
3120: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d   pLock->pBtree =
3130: 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70   p;.    pLock->p
3140: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
3150: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63  k;.    pBt->pLoc
3160: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = pLock;.  }..
3170: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c    /* Set the BtL
3180: 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ock.eLock variab
3190: 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  le to the maximu
31a0: 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  m of the current
31b0: 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74   lock.  ** and t
31c0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
31d0: 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  k. This means if
31e0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61   a write-lock wa
31f0: 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20  s already held. 
3200: 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c   ** and a read-l
3210: 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77  ock requested, w
3220: 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63  e don't incorrec
3230: 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68  tly downgrade th
3240: 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61  e lock..  */.  a
3250: 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43  ssert( WRITE_LOC
3260: 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20  K>READ_LOCK );. 
3270: 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b   if( eLock>pLock
3280: 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ->eLock ){.    p
3290: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c  Lock->eLock = eL
32a0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ock;.  }..  retu
32b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32c0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
32d0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
32e0: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
32f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3300: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52  ED_CACHE./*.** R
3310: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74  elease all the t
3320: 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b  able locks (lock
3330: 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63  s obtained via c
3340: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73  alls to.** the s
3350: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
3360: 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75  leLock() procedu
3370: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
3380: 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a  e object p..**.*
3390: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33a0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72  assumes that Btr
33b0: 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e  ee p has an open
33c0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a   read or write .
33d0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
33e0: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20  If it does not, 
33f0: 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e  then the BTS_PEN
3400: 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79  DING flag.** may
3410: 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   be incorrectly 
3420: 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
3430: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c  ic void clearAll
3440: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3450: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3460: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3470: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
3480: 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26  ock **ppIter = &
3490: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61  pBt->pLock;..  a
34a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
34b0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
34c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
34d0: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d  >sharable || 0==
34e0: 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73  *ppIter );.  ass
34f0: 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
3500: 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  0 );..  while( *
3510: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
3520: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
3530: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
3540: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
3550: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
3560: 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  E)==0 || pBt->pW
3570: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
3580: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
3590: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
35a0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
35b0: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
35c0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
35d0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
35e0: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
35f0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
3600: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
3610: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
3620: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
3630: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
3640: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
3650: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
3660: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
3670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
3680: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
3690: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
36a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ..  assert( (pBt
36b0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
36c0: 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20  _PENDING)==0 || 
36d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
36e0: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
36f0: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74  er==p ){.    pBt
3700: 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20  ->pWriter = 0;. 
3710: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3720: 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53   &= ~(BTS_EXCLUS
3730: 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29  IVE|BTS_PENDING)
3740: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
3750: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
3760: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
3770: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3780: 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20  lled when Btree 
3790: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
37a0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
37b0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
37c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
37d0: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
37e0: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
37f0: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3800: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3810: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3820: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3830: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3840: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
3850: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
3860: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
3870: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
3880: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3890: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
38a0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
38b0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
38c0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
38d0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73   BTS_PENDING mus
38e0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
38f0: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3900: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3910: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3920: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3930: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3940: 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a  = ~BTS_PENDING;.
3950: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
3960: 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67  s function chang
3970: 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63  es all write-loc
3980: 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  ks held by Btree
3990: 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63   p into read-loc
39a0: 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ks..*/.static vo
39b0: 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  id downgradeAllS
39c0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
39d0: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
39e0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
39f0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
3a00: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3a10: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3a20: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
3a30: 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Writer = 0;.    
3a40: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
3a50: 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45   ~(BTS_EXCLUSIVE
3a60: 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20  |BTS_PENDING);. 
3a70: 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74     for(pLock=pBt
3a80: 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20  ->pLock; pLock; 
3a90: 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65  pLock=pLock->pNe
3aa0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
3ab0: 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d  t( pLock->eLock=
3ac0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  =READ_LOCK || pL
3ad0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3ae0: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65  ;.      pLock->e
3af0: 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
3b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
3b10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3b20: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3b30: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
3b40: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
3b50: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3b60: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3b70: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3b80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3b90: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3ba0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3bb0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3bc0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3bd0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3be0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3bf0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3c00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3c10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3c20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3c30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3c50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
3c60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
3c70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
3c80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
3c90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
3ca0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
3cb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
3cc0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
3cd0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
3ce0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
3cf0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
3d00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
3d10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
3d20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
3d30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
3d40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
3d50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
3d60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
3d70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
3d80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
3d90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
3da0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
3db0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
3dc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3dd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
3de0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
3df0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
3e00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
3e10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
3e20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
3e30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
3e40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
3e50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
3e60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
3e70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
3e80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
3e90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
3ea0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
3eb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
3ec0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
3ed0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
3ee0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3ef0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
3f00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
3f10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
3f20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3f30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
3f40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3f50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3f60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
3f70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
3f80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
3f90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
3fa0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
3fb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3fc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3fd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3fe0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3ff0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
4000: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
4010: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
4020: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4030: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
4040: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
4050: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4060: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4070: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4080: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4090: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
40a0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
40b0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
40c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
40d0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
40e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
40f0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
4100: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4110: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
4120: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
4130: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
4140: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
4150: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4160: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4170: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4180: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4190: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
41a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
41b0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
41c0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
41d0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
41e0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
41f0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
4200: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
4210: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
4220: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
4230: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
4240: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
4250: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4260: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4270: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4280: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4290: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
42a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
42b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
42c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
42d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
42e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
42f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
4300: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
4310: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
4320: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
4330: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
4340: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
4350: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4360: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4370: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4380: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4390: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
43a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
43b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
43c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
43d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
43e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
43f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4400: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
4410: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
4420: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
4430: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
4440: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
4450: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4460: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4470: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4480: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4490: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
44a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
44b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
44c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
44d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
44e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
44f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
4500: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
4510: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4520: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
4530: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
4540: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
4550: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4560: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4570: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4580: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4590: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
45a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
45b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
45c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
45d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
45e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
45f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
4600: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
4610: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
4620: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
4630: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4640: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
4650: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4660: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4670: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4680: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4690: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
46a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
46b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
46c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
46d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
46e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
46f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4700: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4710: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4720: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4730: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4740: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4750: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4760: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4770: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4780: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4790: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
47a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
47b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
47c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
47d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
47e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
47f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4800: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4810: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4820: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4830: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4840: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4850: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4860: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4870: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4880: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4890: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
48a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
48b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
48c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
48d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
48e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
48f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4900: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4910: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4920: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4930: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4940: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4950: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4960: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4970: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4980: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4990: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
49a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
49b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
49c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
49d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
49e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
49f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4a00: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4a10: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4a20: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4a30: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4a40: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4a50: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4a60: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4a70: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4a80: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4a90: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4aa0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4ab0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4ac0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4ad0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4ae0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4af0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4b00: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4b10: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4b20: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4b30: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4b40: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4b50: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4b60: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4b70: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4b80: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4b90: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4ba0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4bb0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4bc0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4bd0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4be0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4bf0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4c00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4c10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4c20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4c30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4c40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4c50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4c60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4c70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4c80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4c90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4ca0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4cb0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4cc0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4cd0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4ce0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4cf0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4d00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4d10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4d20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4d30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4d40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4d50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4d60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4d70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4d80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4d90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4da0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4db0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4dc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4dd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4de0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4df0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4e00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4e10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4e20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4e30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4e40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4e50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4e60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4e70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4e80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4e90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4ea0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4eb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4ec0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4ed0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4ee0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4ef0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4f00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4f10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4f20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4f30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4f40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4f50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4f60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4f70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4f80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4f90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4fa0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4fb0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4fc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4fd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4fe0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ff0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
5000: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
5010: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
5020: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
5030: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
5040: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
5050: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5060: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5070: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5080: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5090: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
50a0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
50b0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
50c0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
50d0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
50e0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
50f0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
5100: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
5110: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5120: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5130: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5140: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5150: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5160: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5170: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5180: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5190: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
51a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
51b0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
51c0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
51d0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
51e0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
51f0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
5200: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
5210: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5220: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5230: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5240: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5250: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5260: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5270: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5280: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5290: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
52a0: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
52b0: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
52c0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
52d0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
52e0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
52f0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
5300: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
5310: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5320: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5330: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5340: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5350: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5360: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5370: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5380: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5390: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
53a0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
53b0: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
53c0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
53d0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
53e0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
53f0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
5400: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
5410: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5420: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5430: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5440: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5450: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5460: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5470: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5480: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5490: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
54a0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
54b0: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
54c0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
54d0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
54e0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
54f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
5500: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
5510: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5520: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5530: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5540: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5550: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5560: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5570: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5580: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5590: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
55a0: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
55b0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
55c0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
55d0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
55e0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
55f0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
5600: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
5610: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5620: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5630: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5640: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5650: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5660: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5670: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5680: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5690: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
56a0: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
56b0: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
56c0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
56d0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
56e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
56f0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
5700: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
5710: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5720: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5730: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5740: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5760: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5770: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5790: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
57a0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
57b0: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
57c0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
57d0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
57e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
57f0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
5800: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
5810: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5820: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5830: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5840: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5850: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5860: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5870: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5880: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5890: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
58a0: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
58b0: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
58c0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
58d0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
58e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
58f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5900: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5910: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5920: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5930: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5940: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5950: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5960: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5970: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5980: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5990: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
59a0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
59b0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
59c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
59d0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
59e0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
59f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
5a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
5a10: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5a20: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5a30: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5a40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5a50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5a60: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5a70: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5a80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a90: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5aa0: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5ab0: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
5ac0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
5ad0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
5ae0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
5af0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
5b00: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5b20: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5b30: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5b40: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5b50: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5b60: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5b70: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5b80: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5b90: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5ba0: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5bb0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5bc0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5bd0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5be0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5bf0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5c00: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5c10: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5c20: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5c30: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5c40: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5c50: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5c60: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5c70: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5c80: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5c90: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5ca0: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5cb0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5cc0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5cd0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5ce0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5cf0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5d00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5d10: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5d20: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5d30: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5d40: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5d50: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5d60: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5d70: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5d80: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5d90: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5da0: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5db0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5dc0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5dd0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5de0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5df0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5e00: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5e10: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5e20: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5e30: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5e40: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5e50: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5e60: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5e70: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5e80: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5e90: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5ea0: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5eb0: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5ec0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5ed0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5ee0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5ef0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5f00: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5f10: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5f20: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5f30: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5f40: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5f50: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5f60: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5f70: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5f80: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5f90: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5fa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5fb0: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5fc0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5fd0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5fe0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ff0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
6000: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6010: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6020: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
6030: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
6040: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
6050: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
6060: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
6070: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
6080: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6090: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
60a0: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
60b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
60c0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
60d0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
60e0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
60f0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
6100: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
6110: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6120: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6130: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6140: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6150: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6160: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6170: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6180: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6190: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
61a0: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
61b0: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
61c0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
61d0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
61e0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
61f0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
6200: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
6210: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6220: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6230: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6240: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6250: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6260: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6270: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6280: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6290: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
62a0: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
62b0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
62c0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
62d0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
62e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
62f0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
6300: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
6310: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6320: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6330: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6340: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6350: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6360: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6370: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6380: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6390: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
63a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
63b0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
63c0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
63d0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
63e0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
63f0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
6400: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
6410: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6420: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6440: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6460: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6470: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6480: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6490: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
64a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
64b0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
64c0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
64d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
64e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
64f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
6500: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
6510: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6520: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6530: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6540: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6550: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6560: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6570: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6580: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6590: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
65a0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
65b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
65c0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
65d0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
65e0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
65f0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
6600: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
6610: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6620: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6630: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6640: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6650: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6660: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6670: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6680: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6690: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
66a0: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
66b0: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
66c0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
66d0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
66e0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
66f0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
6700: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
6710: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6720: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6730: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6740: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6750: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6760: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6780: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6790: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
67a0: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
67b0: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
67c0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
67d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
6800: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
6810: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6820: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6830: 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66  dex key */..  if
6840: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
6850: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
6860: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
6870: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
6880: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
6890: 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d  ckedRecord(pCur-
68a0: 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
68b0: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
68c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
68d0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
68e0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
68f0: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
6900: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
6910: 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  , pKey, pIdxKey)
6920: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
6930: 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a  y->nField==0 ){.
6940: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6950: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
6960: 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
6970: 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 29 3b  ->iPage]->pgno);
6980: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
6990: 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20  to_done;.    }. 
69a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
69b0: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
69c0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
69d0: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
69e0: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
69f0: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
6a00: 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20  .moveto_done:.  
6a10: 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
6a20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6a30: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
6a40: 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  >db, pIdxKey);. 
6a50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
6a70: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
6a80: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
6a90: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
6aa0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
6ab0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
6ac0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
6ad0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
6ae0: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
6af0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
6b00: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
6b10: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
6b20: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6b30: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
6b40: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
6b50: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
6b60: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6b70: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
6b80: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
6b90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
6ba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6bb0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6bc0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
6bd0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6be0: 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78  c;.  int skipNex
6bf0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  t;.  assert( cur
6c00: 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
6c10: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6c20: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6c30: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6c40: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6c50: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6c60: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6c70: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6c80: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6c90: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6ca0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
6cb0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
6cc0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
6cd0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
6ce0: 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28  skipNext);.  if(
6cf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6d00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6d10: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6d20: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
6d30: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
6d40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6d50: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
6d60: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6d70: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
6d80: 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
6d90: 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20   |= skipNext;.  
6da0: 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
6db0: 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53  Next && pCur->eS
6dc0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6dd0: 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ID ){.      pCur
6de0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6df0: 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20  R_SKIPNEXT;.    
6e00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6e10: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
6e20: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6e30: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
6e40: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6e50: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
6e60: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
6e70: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6e80: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
6e90: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
6ea0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
6eb0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
6ec0: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
6ed0: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
6ee0: 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61  n where.** it wa
6ef0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f  s last placed, o
6f00: 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c  r has been inval
6f10: 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f  idated for any o
6f20: 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20  ther reason..** 
6f30: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
6f40: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
6f50: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
6f60: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
6f70: 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20  t.** from under 
6f80: 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  them, for exampl
6f90: 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74  e.  Cursor might
6fa0: 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20   also move if a 
6fb0: 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61  btree.** is reba
6fc0: 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61  lanced..**.** Ca
6fd0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6fe0: 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ne with a NULL c
6ff0: 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65  ursor pointer re
7000: 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  turns false..**.
7010: 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72  ** Use the separ
7020: 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  ate sqlite3Btree
7030: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20  CursorRestore() 
7040: 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f  routine to resto
7050: 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62  re a cursor.** b
7060: 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20  ack to where it 
7070: 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74  ought to be if t
7080: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
7090: 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74  rns true..*/.int
70a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
70b0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
70c0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
70d0: 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61  eturn pCur->eSta
70e0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
70f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7100: 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73  routine restores
7110: 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74   a cursor back t
7120: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70  o its original p
7130: 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74  osition after it
7140: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76  .** has been mov
7150: 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69  ed by some outsi
7160: 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63  de activity (suc
7170: 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62  h as a btree reb
7180: 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72  alance or.** a r
7190: 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64  ow having been d
71a0: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
71b0: 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
71c0: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ).  .**.** On su
71d0: 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66  ccess, the *pDif
71e0: 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65  ferentRow parame
71f0: 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20  ter is false if 
7200: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
7210: 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61  ft.** pointing a
7220: 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  t exactly the sa
7230: 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65  me row.  *pDiffe
7240: 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f  rntRow is the ro
7250: 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  w the cursor.** 
7260: 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  was pointing to 
7270: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
7280: 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75  , forcing the cu
7290: 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
72a0: 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20   some.** nearby 
72b0: 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
72c0: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
72d0: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f  nly be called fo
72e0: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
72f0: 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a  just returned.**
7300: 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74   TRUE from sqlit
7310: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
7320: 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20  Moved()..*/.int 
7330: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7340: 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73  orRestore(BtCurs
7350: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
7360: 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20  DifferentRow){. 
7370: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
7380: 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
7390: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
73a0: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
73b0: 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  LID );.  rc = re
73c0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
73d0: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
73e0: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66   rc ){.    *pDif
73f0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
7400: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7410: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
7420: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7430: 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  ID ){.    *pDiff
7440: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7450: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7460: 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
7470: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69  t==0 );.    *pDi
7480: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a  fferentRow = 0;.
7490: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
74a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
74b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
74c0: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
74d0: 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73  ** Provide hints
74e0: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20   to the cursor. 
74f0: 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20   The particular 
7500: 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20  hint given (and 
7510: 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20  the type.** and 
7520: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61  number of the va
7530: 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73  rargs parameters
7540: 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  ) is determined 
7550: 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65  by the eHintType
7560: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20  .** parameter.  
7570: 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69  See the definiti
7580: 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45  ons of the BTREE
7590: 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66  _HINT_* macros f
75a0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76  or details..*/.v
75b0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
75c0: 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72  CursorHint(BtCur
75d0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65  sor *pCur, int e
75e0: 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a  HintType, ...){.
75f0: 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62    /* Used only b
7600: 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75  y system that su
7610: 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f  bstitute their o
7620: 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e  wn storage engin
7630: 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  e */.}.#endif../
7640: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61  *.** Provide fla
7650: 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  g hints to the c
7660: 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ursor..*/.void s
7670: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7680: 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72  rHintFlags(BtCur
7690: 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67  sor *pCur, unsig
76a0: 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74  ned x){.  assert
76b0: 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f  ( x==BTREE_SEEK_
76c0: 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42  EQ || x==BTREE_B
76d0: 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20  ULKLOAD || x==0 
76e0: 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73  );.  pCur->hints
76f0: 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65   = x;.}...#ifnde
7700: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
7710: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
7720: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
7730: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
7740: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
7750: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
7760: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
7770: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
7780: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
7790: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
77a0: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
77b0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
77c0: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
77d0: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
77e0: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
77f0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
7800: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
7810: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
7820: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
7830: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
7840: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
7850: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
7860: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
7870: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
7880: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7890: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
78a0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
78b0: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
78c0: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
78d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
78e0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
78f0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
7900: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
7910: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
7920: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
7930: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
7940: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
7950: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
7960: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
7970: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
7980: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
7990: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
79a0: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
79b0: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
79c0: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
79d0: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
79e0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
79f0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
7a00: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
7a10: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7a20: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7a30: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
7a40: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
7a50: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
7a60: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
7a70: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
7a80: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
7a90: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
7aa0: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
7ab0: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
7ac0: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
7ad0: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
7ae0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
7af0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
7b00: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
7b10: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
7b20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
7b30: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
7b40: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7b50: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
7b60: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
7b70: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
7b80: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
7b90: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
7ba0: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7bb0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7bc0: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
7bd0: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
7be0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7bf0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
7c00: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
7c10: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
7c20: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
7c30: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
7c40: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
7c50: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
7c60: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
7c70: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
7c80: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
7c90: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7ca0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7cb0: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
7cc0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
7cd0: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
7ce0: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
7cf0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7d00: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
7d10: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
7d20: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
7d30: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
7d40: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7d50: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7d60: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7d70: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7d80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7d90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7da0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7db0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7dc0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7dd0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7de0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
7df0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
7e00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7e10: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
7e20: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
7e30: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
7e40: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7e50: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
7e60: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
7e70: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7e80: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7e90: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
7ea0: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
7eb0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
7ec0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
7ed0: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
7ee0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
7ef0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7f00: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
7f10: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
7f20: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
7f30: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
7f40: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
7f50: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
7f60: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
7f70: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
7f80: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
7f90: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
7fa0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
7fb0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
7fc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7fd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
7fe0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
7ff0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
8000: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
8010: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
8020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
8030: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
8040: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8050: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
8060: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
8070: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
8080: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
8090: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
80a0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
80b0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
80c0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
80d0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
80e0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
80f0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
8100: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
8110: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
8120: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8130: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
8140: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
8150: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
8160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8170: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
8180: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
8190: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
81a0: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
81b0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
81c0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
81d0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
81e0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
81f0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
8200: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
8210: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
8220: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
8230: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
8240: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8250: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
8260: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
8270: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
8280: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
8290: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
82a0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
82b0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
82c0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
82d0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
82e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
82f0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
8300: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
8310: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
8320: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8330: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
8340: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
8350: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
8360: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
8370: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
8380: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
8390: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
83a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
83b0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
83c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
83d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
83e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
83f0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
8400: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
8410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
8420: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
8430: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
8440: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
8450: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
8460: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8470: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
8480: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8490: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
84a0: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
84b0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
84c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
84d0: 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a  _PGNO(iPtrmap);.
84e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
84f0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
8500: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
8510: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
8520: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
8530: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
8540: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
8550: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
8560: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
8570: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
8580: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
8590: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
85a0: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
85b0: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
85c0: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
85d0: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
85e0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
85f0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
8600: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
8610: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
8620: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
8630: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
8640: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
8650: 28 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  () does the same
8660: 20 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73   except it skips
8670: 20 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61   past the initia
8680: 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c  l.** 4-byte chil
8690: 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20  d pointer found 
86a0: 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  on interior page
86b0: 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  s, if there is o
86c0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
86d0: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
86e0: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
86f0: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
8700: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
8710: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
8720: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
8730: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
8740: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
8750: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
8760: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
8770: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
8780: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49  dCellPastPtr(P,I
8790: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
87a0: 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61  aOfst + ((P)->ma
87b0: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
87c0: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
87d0: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
87e0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ).../*.** This i
87f0: 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72  s common tail pr
8800: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72  ocessing for btr
8810: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8820: 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72   and.** btreePar
8830: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8840: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
8850: 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73  en the cell does
8860: 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c   not fit entirel
8870: 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65  y.** on a single
8880: 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d   B-tree page.  M
8890: 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64  ake necessary ad
88a0: 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65  justments to the
88b0: 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72   CellInfo.** str
88c0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
88d0: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
88e0: 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  E void btreePars
88f0: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
8900: 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65  orOverflow(.  Me
8910: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
8920: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
8930: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
8940: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
8950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8960: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
8970: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
8980: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
8990: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
89a0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
89b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  re */.){.  /* If
89c0: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
89d0: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
89e0: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
89f0: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8a00: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
8a10: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
8a20: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
8a30: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
8a40: 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  nto.  ** overflo
8a50: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
8a60: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
8a70: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
8a80: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20   of unused.  ** 
8a90: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
8aa0: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
8ab0: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
8ac0: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
8ad0: 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65  e.  ** in betwee
8ae0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8af0: 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20  axLocal..  **.  
8b00: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
8b10: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
8b20: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
8b30: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
8b40: 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69   any.  ** way wi
8b50: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
8b60: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
8b70: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20  e format..  */. 
8b80: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
8b90: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
8ba0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
8bb0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
8bc0: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
8bd0: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
8be0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8bf0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8c00: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
8c10: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
8c20: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
8c30: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
8c40: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
8c50: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8c60: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
8c70: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75  ->maxLocal;.  su
8c80: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
8c90: 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   + (pInfo->nPayl
8ca0: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
8cb0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8cc0: 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65  bleSize-4);.  te
8cd0: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
8ce0: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  =maxLocal );.  t
8cf0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8d00: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
8d10: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
8d20: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
8d30: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8d40: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
8d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
8d60: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8d70: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  )minLocal;.  }. 
8d80: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
8d90: 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50  (u16)(&pInfo->pP
8da0: 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c  ayload[pInfo->nL
8db0: 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b  ocal] - pCell) +
8dc0: 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   4;.}../*.** The
8dd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
8de0: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
8df0: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
8e00: 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c  emPage.xParseCel
8e10: 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  l().** method..*
8e20: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c  *.** Parse a cel
8e30: 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20  l content block 
8e40: 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  and fill in the 
8e50: 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75  CellInfo structu
8e60: 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50  re..**.** btreeP
8e70: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20  arseCellPtr()   
8e80: 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20       =>   table 
8e90: 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73  btree leaf nodes
8ea0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8eb0: 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d  llNoPayload()  =
8ec0: 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20  >   table btree 
8ed0: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
8ee0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8ef0: 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20  PtrIndex()   => 
8f00: 20 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f    index btree no
8f10: 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  des.**.** There 
8f20: 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65  is also a wrappe
8f30: 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65  r function btree
8f40: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74  ParseCell() that
8f50: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c   works for.** al
8f60: 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20  l MemPage types 
8f70: 61 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e  and that referen
8f80: 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20  ces the cell by 
8f90: 69 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61  index rather tha
8fa0: 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e  n.** by pointer.
8fb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8fc0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8fd0: 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65  rNoPayload(.  Me
8fe0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
8ff0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9000: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9010: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9030: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9040: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9050: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9060: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9070: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9080: 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  re */.){.  asser
9090: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
90a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
90b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
90c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
90d0: 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  f==0 );.  assert
90e0: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
90f0: 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e  rSize==4 );.#ifn
9100: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9110: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9120: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
9130: 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  if.  pInfo->nSiz
9140: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
9150: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
9160: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9170: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
9180: 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  oad = 0;.  pInfo
9190: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20  ->nLocal = 0;.  
91a0: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
91b0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
91c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
91d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
91e0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
91f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9200: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9210: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
9220: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9230: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
9240: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
9250: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
9260: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
9270: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
9280: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
9290: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
92a0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
92b0: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
92c0: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
92d0: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
92e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
92f0: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
9300: 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b  load */.  u64 iK
9310: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
9320: 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b    /* Extracted K
9330: 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61  ey value */..  a
9340: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9350: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9360: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9370: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9380: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
9390: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
93a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
93b0: 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61  ntKeyLeaf );.  a
93c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
93d0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b  ildPtrSize==0 );
93e0: 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  .  pIter = pCell
93f0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
9400: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
9410: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
9420: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
9430: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
9440: 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c  t32(pIter, nPayl
9450: 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oad);.  **.  ** 
9460: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
9470: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
9480: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
9490: 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
94a0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50  *pIter;.  if( nP
94b0: 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a  ayload>=0x80 ){.
94c0: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
94d0: 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50  pIter[8];.    nP
94e0: 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a  ayload &= 0x7f;.
94f0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50      do{.      nP
9500: 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f  ayload = (nPaylo
9510: 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ad<<7) | (*++pIt
9520: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
9530: 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29  }while( (*pIter)
9540: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
9550: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
9560: 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  ter++;..  /* The
9570: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63   next block of c
9580: 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ode is equivalen
9590: 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
95a0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
95b0: 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75  Varint(pIter, (u
95c0: 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  64*)&pInfo->nKey
95d0: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
95e0: 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64   code is inlined
95f0: 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63   to avoid a func
9600: 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a  tion call..  */.
9610: 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b    iKey = *pIter;
9620: 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38  .  if( iKey>=0x8
9630: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9640: 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20  d = &pIter[7];. 
9650: 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b     iKey &= 0x7f;
9660: 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20  .    while(1){. 
9670: 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65       iKey = (iKe
9680: 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  y<<7) | (*++pIte
9690: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20  r & 0x7f);.     
96a0: 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78   if( (*pIter)<0x
96b0: 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  80 ) break;.    
96c0: 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e    if( pIter>=pEn
96d0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65  d ){.        iKe
96e0: 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20  y = (iKey<<8) | 
96f0: 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20  *++pIter;.      
9700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74  .    }.  }.  pIt
9720: 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  er++;..  pInfo->
9730: 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69  nKey = *(i64*)&i
9740: 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  Key;.  pInfo->nP
9750: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
9760: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  d;.  pInfo->pPay
9770: 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20  load = pIter;.  
9780: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9790: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
97a0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
97b0: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
97c0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
97d0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
97e0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
97f0: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
9800: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
9810: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
9820: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
9830: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
9840: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
9850: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
9860: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
9870: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
9880: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
9890: 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  + (u16)(pIter - 
98a0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
98b0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29  pInfo->nSize<4 )
98c0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
98d0: 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  4;.    pInfo->nL
98e0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
98f0: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
9900: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
9910: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
9920: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
9930: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
9940: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
9950: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9960: 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65  Index(.  MemPage
9970: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9980: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9990: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
99a0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
99b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
99c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
99d0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
99e0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
99f0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9a00: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9a10: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a30: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9a40: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9a50: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9a70: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9a80: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a  ell payload */..
9a90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9aa0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9ab0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9ac0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9ad0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9ae0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9af0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9b00: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20  ->intKeyLeaf==0 
9b10: 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65  );.  pIter = pCe
9b20: 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll + pPage->chil
9b30: 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79  dPtrSize;.  nPay
9b40: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9b50: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9b60: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9b70: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9b80: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9b90: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9ba0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9bb0: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9bc0: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9bd0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a  );.    }while( *
9be0: 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  (pIter)>=0x80 &&
9bf0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9c00: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20   }.  pIter++;.  
9c10: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50  pInfo->nKey = nP
9c20: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
9c30: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
9c40: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
9c50: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
9c60: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9c70: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9c80: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9c90: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9ca0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
9cb0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
9cc0: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
9cd0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
9ce0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
9cf0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
9d00: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
9d10: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
9d20: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
9d30: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
9d40: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
9d50: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
9d60: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
9d70: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
9d80: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
9d90: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
9da0: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
9db0: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
9dc0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
9dd0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
9de0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
9df0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9e00: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9e10: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9e20: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9e30: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9e40: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9e50: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9e60: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9e70: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
9e80: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
9e90: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
9ea0: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
9eb0: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
9ec0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
9ed0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
9ee0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
9ef0: 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78  */.){.  pPage->x
9f00: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
9f10: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9f20: 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b   iCell), pInfo);
9f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
9f40: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
9f50: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   are implementat
9f60: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ions of the MemP
9f70: 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a  age.xCellSize.**
9f80: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43   method..**.** C
9f90: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
9fa0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9fb0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
9fc0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
9fd0: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
9fe0: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
9ff0: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
a000: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
a010: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
a020: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
a030: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
a040: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
a050: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
a060: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
a070: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  cell pointer..**
a080: 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  .** cellSizePtrN
a090: 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e  oPayload()    =>
a0a0: 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61     table interna
a0b0: 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53  l nodes.** cellS
a0c0: 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20  izePtr()        
a0d0: 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e       =>   all in
a0e0: 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c  dex nodes & tabl
a0f0: 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a  e leaf nodes.*/.
a100: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
a110: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
a120: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
a130: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
a140: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
a150: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
a160: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
a170: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
a180: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a1b0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
a1c0: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
a1d0: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
a200: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
a210: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a220: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
a230: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
a240: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
a250: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
a260: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
a270: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
a280: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
a290: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
a2a0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
a2b0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
a2c0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
a2d0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
a2e0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
a2f0: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
a300: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
a310: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
a320: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
a330: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
a340: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
a350: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a360: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
a370: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
a380: 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70  if..  nSize = *p
a390: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a  Iter;.  if( nSiz
a3a0: 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70  e>=0x80 ){.    p
a3b0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
a3c0: 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78  .    nSize &= 0x
a3d0: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
a3e0: 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65    nSize = (nSize
a3f0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a400: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a410: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a420: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a430: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a440: 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  r++;.  if( pPage
a450: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
a460: 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69  /* pIter now poi
a470: 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69  nts at the 64-bi
a480: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61  t integer key va
a490: 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20  lue, a variable 
a4a0: 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69  length .    ** i
a4b0: 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c  nteger. The foll
a4c0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65  owing block move
a4d0: 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  s pIter to point
a4e0: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79   at the first by
a4f0: 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  te.    ** past t
a500: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65  he end of the ke
a510: 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20  y value. */.    
a520: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d  pEnd = &pIter[9]
a530: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70  ;.    while( (*p
a540: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
a550: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a560: 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  }.  testcase( nS
a570: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a580: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
a590: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a5a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
a5b0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61    if( nSize<=pPa
a5c0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a5d0: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33      nSize += (u3
a5e0: 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  2)(pIter - pCell
a5f0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
a600: 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  <4 ) nSize = 4;.
a610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
a620: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
a630: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
a640: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
a650: 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e  l + (nSize - min
a660: 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d  Local) % (pPage-
a670: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a680: 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
a690: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
a6a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a6b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
a6c0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
a6d0: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
a6e0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
a6f0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
a700: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
a710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a  ;.    }.    nSiz
a720: 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70  e += 4 + (u16)(p
a730: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
a740: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69   }.  assert( nSi
a750: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
a760: 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
a770: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
a780: 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74  16)nSize;.}.stat
a790: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
a7a0: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50  trNoPayload(MemP
a7b0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
a7c0: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
a7d0: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b  ter = pCell + 4;
a7e0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
a7f0: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
a800: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
a810: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a820: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
a830: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66  a varint */..#if
a840: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a850: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
a860: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
a870: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
a880: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
a890: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
a8a0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
a8b0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
a8c0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
a8d0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
a8e0: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
a8f0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
a900: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
a910: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
a920: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
a930: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
a940: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
a950: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
a960: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
a970: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
a980: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
a990: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
a9a0: 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55  info);.#else.  U
a9b0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
a9c0: 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  pPage);.#endif..
a9d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a9e0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34  >childPtrSize==4
a9f0: 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74   );.  pEnd = pIt
aa00: 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28  er + 9;.  while(
aa10: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
aa20: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
aa30: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75  ;.  assert( debu
aa40: 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31  ginfo.nSize==(u1
aa50: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
aa60: 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
aa70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
aa80: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
aa90: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
aaa0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69  ITE_DEBUG./* Thi
aab0: 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63  s variation on c
aac0: 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20  ellSizePtr() is 
aad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
aae0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
aaf0: 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73  ts.** only. */.s
ab00: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
ab10: 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ze(MemPage *pPag
ab20: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
ab30: 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78   return pPage->x
ab40: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
ab50: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
ab60: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
ab70: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
ab80: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ab90: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
aba0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
abb0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
abc0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
abd0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
abe0: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
abf0: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
ac00: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
ac10: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
ac20: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
ac30: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
ac40: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
ac50: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
ac60: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
ac70: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
ac80: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
ac90: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
aca0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  ell!=0 );.  pPag
acb0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
acc0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
acd0: 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e  o);.  if( info.n
ace0: 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c  Local<info.nPayl
acf0: 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  oad ){.    Pgno 
ad00: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
ad10: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
ad20: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
ad30: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
ad40: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
ad50: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
ad60: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
ad70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
ad80: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
ad90: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
ada0: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
adb0: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
adc0: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
add0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
ade0: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
adf0: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
ae00: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
ae10: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
ae20: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
ae30: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
ae40: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
ae50: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
ae60: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
ae70: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
ae80: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
ae90: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
aea0: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
aeb0: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
aec0: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
aed0: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
aee0: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
aef0: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
af00: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
af10: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
af20: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
af30: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
af40: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
af50: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
af60: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
af70: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
af80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
af90: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
afa0: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
afb0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
afc0: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
afd0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aff0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b000: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b020: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
b030: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
b040: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
b050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b060: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
b070: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
b080: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
b090: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b0a0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
b0b0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
b0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b0d0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
b0e0: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
b0f0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
b100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b110: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
b120: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
b130: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
b160: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
b170: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
b180: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
b190: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b1a0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
b1b0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
b1c0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
b1d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
b1e0: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
b1f0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
b200: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
b210: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
b220: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
b230: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
b240: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
b250: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
b260: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
b270: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b280: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
b290: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
b2a0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
b2b0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b2c0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
b2d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
b2e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
b2f0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
b300: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
b310: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
b320: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
b330: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b340: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
b350: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
b360: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b370: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
b380: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b390: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b3a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b3b0: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
b3c0: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
b3d0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
b3e0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
b3f0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
b400: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
b410: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
b420: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
b430: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
b440: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
b450: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69  a[hdr+3]) );.  i
b460: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
b470: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
b480: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
b490: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b4a0: 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54  bleSize;..  /* T
b4b0: 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
b4c0: 73 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f  s pages with two
b4d0: 20 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62   or fewer free b
b4e0: 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72  locks and nMaxFr
b4f0: 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72  ag.  ** or fewer
b500: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
b510: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
b520: 69 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20  it is faster to 
b530: 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77  move the.  ** tw
b540: 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b  o (or one) block
b550: 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67  s of cells using
b560: 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61   memmove() and a
b570: 64 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a  dd the required.
b580: 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20    ** offsets to 
b590: 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20  each pointer in 
b5a0: 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
b5b0: 20 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69   array than it i
b5c0: 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e  s to .  ** recon
b5d0: 73 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72  struct the entir
b5e0: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66  e page.  */.  if
b5f0: 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b  ( (int)data[hdr+
b600: 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a  7]<=nMaxFrag ){.
b610: 20 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20      int iFree = 
b620: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b630: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+1]);.    if( 
b640: 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69  iFree ){.      i
b650: 6e 74 20 69 46 72 65 65 32 20 3d 20 67 65 74 32  nt iFree2 = get2
b660: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
b670: 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61  ]);..      /* pa
b680: 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 68 61 73  geFindSlot() has
b690: 20 61 6c 72 65 61 64 79 20 76 65 72 69 66 69 65   already verifie
b6a0: 64 20 74 68 61 74 20 66 72 65 65 20 62 6c 6f 63  d that free bloc
b6b0: 6b 73 20 61 72 65 20 73 6f 72 74 65 64 0a 20 20  ks are sorted.  
b6c0: 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20      ** in order 
b6d0: 6f 66 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  of offset within
b6e0: 20 74 68 65 20 70 61 67 65 2c 20 61 6e 64 20 74   the page, and t
b6f0: 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74  hat no block ext
b700: 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ends.      ** pa
b710: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
b720: 65 20 70 61 67 65 2e 20 50 72 6f 76 69 64 65 64  e page. Provided
b730: 20 74 68 65 20 74 77 6f 20 66 72 65 65 20 73 6c   the two free sl
b740: 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20  ots do not .    
b750: 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68    ** overlap, th
b760: 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
b770: 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29  at the memmove()
b780: 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c   calls below wil
b790: 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f  l not.      ** o
b7a0: 76 65 72 77 72 69 74 65 20 74 68 65 20 75 73 61  verwrite the usa
b7b0: 62 6c 65 53 69 7a 65 20 62 79 74 65 20 62 75 66  bleSize byte buf
b7c0: 66 65 72 2c 20 65 76 65 6e 20 69 66 20 74 68 65  fer, even if the
b7d0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 0a 20   database page. 
b7e0: 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 72 72 75       ** is corru
b7f0: 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  pt.  */.      as
b800: 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20  sert( iFree2==0 
b810: 7c 7c 20 69 46 72 65 65 32 3e 69 46 72 65 65 20  || iFree2>iFree 
b820: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b830: 20 69 46 72 65 65 2b 67 65 74 32 62 79 74 65 28   iFree+get2byte(
b840: 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 20  &data[iFree+2]) 
b850: 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  <= usableSize );
b860: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
b870: 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65  Free2==0 || iFre
b880: 65 32 2b 67 65 74 32 62 79 74 65 28 26 64 61 74  e2+get2byte(&dat
b890: 61 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20  a[iFree2+2]) <= 
b8a0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20  usableSize );.. 
b8b0: 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65       if( 0==iFre
b8c0: 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65  e2 || (data[iFre
b8d0: 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  e2]==0 && data[i
b8e0: 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a  Free2+1]==0) ){.
b8f0: 20 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64          u8 *pEnd
b900: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b910: 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a  set + nCell*2];.
b920: 20 20 20 20 20 20 20 20 75 38 20 2a 70 41 64 64          u8 *pAdd
b930: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  r;.        int s
b940: 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  z2 = 0;.        
b950: 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74  int sz = get2byt
b960: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d  e(&data[iFree+2]
b970: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  );.        int t
b980: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
b990: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
b9a0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20       if( iFree2 
b9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
b9c0: 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32   iFree+sz>iFree2
b9d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
b9e0: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
b9f0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
ba00: 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32        sz2 = get2
ba10: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
ba20: 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  2+2]);.         
ba30: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 2b 73   assert( iFree+s
ba40: 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46  z+sz2+iFree2-(iF
ba50: 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c  ree+sz) <= usabl
ba60: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
ba70: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
ba80: 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20  [iFree+sz+sz2], 
ba90: 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c  &data[iFree+sz],
baa0: 20 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73   iFree2-(iFree+s
bab0: 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  z));.          s
bac0: 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20  z += sz2;.      
bad0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b    }.        cbrk
bae0: 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20   = top+sz;.     
baf0: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
bb00: 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75  (iFree-top) <= u
bb10: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
bb20: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61       memmove(&da
bb30: 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  ta[cbrk], &data[
bb40: 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29  top], iFree-top)
bb50: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 41  ;.        for(pA
bb60: 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ddr=&data[cellOf
bb70: 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e  fset]; pAddr<pEn
bb80: 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20  d; pAddr+=2){.  
bb90: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
bba0: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
bbb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
bbc0: 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74 65  Free ){ put2byte
bbd0: 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20  (pAddr, pc+sz); 
bbe0: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65  }.          else
bbf0: 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20 29   if( pc<iFree2 )
bc00: 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72  { put2byte(pAddr
bc10: 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20  , pc+sz2); }.   
bc20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
bc30: 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f  oto defragment_o
bc40: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
bc50: 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20  }.  }..  cbrk = 
bc60: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43  usableSize;.  iC
bc70: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
bc80: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28  Size - 4;.  for(
bc90: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
bca0: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
bcb0: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
bcc0: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
bcd0: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
bce0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
bcf0: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
bd00: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
bd10: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bd20: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
bd30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bd40: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
bd50: 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f  .    /* These co
bd60: 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c  nditions have al
bd70: 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66  ready been verif
bd80: 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74  ied in btreeInit
bd90: 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66  Page().    ** if
bda0: 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a   PRAGMA cell_siz
bdb0: 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20  e_check=ON..    
bdc0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
bdd0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
bde0: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
bdf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
be00: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
be10: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  ge->pgno);.    }
be20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
be30: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
be40: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
be50: 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65      size = pPage
be60: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
be70: 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20  e, &src[pc]);.  
be80: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
be90: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
bea0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
beb0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
bec0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
bed0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
bee0: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
bef0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
bf00: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
bf10: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
bf20: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
bf30: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
bf40: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
bf50: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
bf60: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
bf70: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
bf80: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
bf90: 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65  brk);.    if( te
bfa0: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mp==0 ){.      i
bfb0: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
bfc0: 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69  cbrk==pc ) conti
bfd0: 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20  nue;.      temp 
bfe0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
bff0: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
c000: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
c010: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
c020: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
c030: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d       memcpy(&tem
c040: 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20  p[x], &data[x], 
c050: 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29  (cbrk+size) - x)
c060: 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65  ;.      src = te
c070: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  mp;.    }.    me
c080: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
c090: 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65  , &src[pc], size
c0a0: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
c0b0: 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72  r+7] = 0;.. defr
c0c0: 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66  agment_out:.  if
c0d0: 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62  ( data[hdr+7]+cb
c0e0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
c0f0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
c100: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c110: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
c120: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
c130: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
c140: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
c150: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c160: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
c170: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
c180: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
c190: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
c1a0: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
c1b0: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
c1c0: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
c1d0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
c1e0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
c1f0: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
c200: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c210: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
c220: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
c230: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
c240: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
c250: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
c260: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
c270: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
c280: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c290: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
c2a0: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
c2b0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
c2c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
c2d0: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
c2e0: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
c2f0: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
c300: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
c310: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
c320: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
c330: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
c340: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
c350: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
c360: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
c370: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c380: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
c390: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74  rned..**.** Slot
c3a0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
c3b0: 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77  st that are betw
c3c0: 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65  een 1 and 3 byte
c3d0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42  s larger than nB
c3e0: 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69  yte.** will be i
c3f0: 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67  gnored if adding
c400: 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65   the extra space
c410: 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74   to the fragment
c420: 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63  ation count.** c
c430: 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65  auses the fragme
c440: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f  ntation count to
c450: 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73   exceed 60..*/.s
c460: 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69  tatic u8 *pageFi
c470: 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a  ndSlot(MemPage *
c480: 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  pPg, int nByte, 
c490: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e  int *pRc){.  con
c4a0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
c4b0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
c4c0: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
c4d0: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
c4e0: 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20  int iAddr = hdr 
c4f0: 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20  + 1;.  int pc = 
c500: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
c510: 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78  iAddr]);.  int x
c520: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
c530: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
c540: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73  sableSize;..  as
c550: 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20  sert( pc>0 );.  
c560: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  do{.    int size
c570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c580: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
c590: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
c5a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
c5b0: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
c5c0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
c5d0: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
c5e0: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
c5f0: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
c600: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
c610: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
c620: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
c630: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
c640: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
c650: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
c660: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
c670: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
c680: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
c690: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
c6a0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
c6b0: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
c6c0: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
c6d0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
c6e0: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
c6f0: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
c700: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
c710: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
c720: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
c730: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
c740: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
c750: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
c760: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
c770: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
c780: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
c790: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c7a0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
c7b0: 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c  ( pc < pPg->cell
c7c0: 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43  Offset+2*pPg->nC
c7d0: 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e  ell || size+pc >
c7e0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
c7f0: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
c800: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
c810: 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  O(pPg->pgno);.  
c820: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
c830: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c840: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  x<4 ){.        /
c850: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
c860: 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20  -11498-58022 In 
c870: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
c880: 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74  tree page, the t
c890: 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  otal.        ** 
c8a0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c8b0: 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79  in fragments may
c8c0: 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20   not exceed 60. 
c8d0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  */.        if( a
c8e0: 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29  Data[hdr+7]>57 )
c8f0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20   return 0;..    
c900: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
c910: 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20  e slot from the 
c920: 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74  free-list. Updat
c930: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  e the number of.
c940: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
c950: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
c960: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
c970: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
c980: 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61  aData[iAddr], &a
c990: 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  Data[pc], 2);.  
c9a0: 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b        aData[hdr+
c9b0: 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20  7] += (u8)x;.   
c9c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c9d0: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
c9e0: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
c9f0: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
ca00: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
ca10: 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  nt.         ** f
ca20: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
ca30: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
ca40: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
ca50: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ca60: 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  aData[pc+2], x);
ca70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
ca80: 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20  eturn &aData[pc 
ca90: 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  + x];.    }.    
caa0: 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20  iAddr = pc;.    
cab0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
cac0: 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68  Data[pc]);.  }wh
cad0: 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72 65  ile( pc );..  re
cae0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
caf0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
cb00: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
cb10: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
cb20: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
cb30: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
cb40: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
cb50: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
cb60: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
cb70: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
cb80: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
cb90: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
cba0: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
cbb0: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
cbc0: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
cbd0: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
cbe0: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
cbf0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
cc00: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
cc10: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
cc20: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
cc30: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
cc40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
cc50: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
cc60: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
cc70: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
cc80: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
cc90: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
cca0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
ccb0: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
ccc0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
ccd0: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
cce0: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
ccf0: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
cd00: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
cd10: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
cd20: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
cd30: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
cd40: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
cd50: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
cd60: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
cd70: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
cd80: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
cd90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
cda0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
cdb0: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
cdc0: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
cdd0: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
cde0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
cdf0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
ce00: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
ce10: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
ce20: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
ce30: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
ce40: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
ce50: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
ce80: 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  te of cell conte
ce90: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
cea0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74    /* Integer ret
ced0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
cee0: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
cef0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
cf00: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
cf10: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
cf20: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a  l content */.  .
cf30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cf40: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
cf50: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
cf60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
cf70: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
cf80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
cf90: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
cfa0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
cfb0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
cfc0: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
cfd0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
cfe0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
cff0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
d000: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
d010: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
d020: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d030: 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50  nByte < (int)(pP
d040: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d050: 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73  Size-8) );..  as
d060: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c  sert( pPage->cel
d070: 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b  lOffset == hdr +
d080: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
d090: 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70  eaf );.  gap = p
d0a0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
d0b0: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
d0c0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70  l;.  assert( gap
d0d0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20  <=65536 );.  /* 
d0e0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
d0f0: 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74 68  9356-02391 If th
d100: 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73 20  e database uses 
d110: 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61 67  a 65536-byte pag
d120: 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20  e size.  ** and 
d130: 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70 61  the reserved spa
d140: 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20  ce is zero (the 
d150: 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  usual value for 
d160: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29 0a  reserved space).
d170: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65    ** then the ce
d180: 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65  ll content offse
d190: 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61  t of an empty pa
d1a0: 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36  ge wants to be 6
d1b0: 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76  5536..  ** Howev
d1c0: 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72  er, that integer
d1d0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f   is too large to
d1e0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20   be stored in a 
d1f0: 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  2-byte unsigned.
d200: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f    ** integer, so
d210: 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73   a value of 0 is
d220: 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61   used in its pla
d230: 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  ce. */.  top = g
d240: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
d250: 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  r+5]);.  assert(
d260: 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65   top<=(int)pPage
d270: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d280: 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20  e ); /* Prevent 
d290: 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  by getAndInitPag
d2a0: 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70  e() */.  if( gap
d2b0: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20  >top ){.    if( 
d2c0: 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d  top==0 && pPage-
d2d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d2e0: 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20  ==65536 ){.     
d2f0: 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20   top = 65536;.  
d300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
d310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d320: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
d330: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  >pgno);.    }.  
d340: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
d350: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
d360: 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64   between gap and
d370: 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72   top for one mor
d380: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20  e cell pointer. 
d390: 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20   ** array entry 
d3a0: 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74  offset, and if t
d3b0: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e  he freelist is n
d3c0: 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73  ot empty, then s
d3d0: 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66  earch the.  ** f
d3e0: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
d3f0: 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20  for a free slot 
d400: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
d410: 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73  tisfy the reques
d420: 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  t..  */.  testca
d430: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
d440: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
d450: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
d460: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
d470: 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b   );.  if( (data[
d480: 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68  hdr+2] || data[h
d490: 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c  dr+1]) && gap+2<
d4a0: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a  =top ){.    u8 *
d4b0: 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e  pSpace = pageFin
d4c0: 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79  dSlot(pPage, nBy
d4d0: 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  te, &rc);.    if
d4e0: 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  ( pSpace ){.    
d4f0: 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65    assert( pSpace
d500: 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63  >=data && (pSpac
d510: 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20  e - data)<65536 
d520: 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  );.      *pIdx =
d530: 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20   (int)(pSpace - 
d540: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  data);.      ret
d550: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
d560: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
d570: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d580: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
d590: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
d5a0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c  could not be ful
d5b0: 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66  filled using a f
d5c0: 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43  reelist slot.  C
d5d0: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
d5e0: 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74   if defragmentat
d5f0: 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
d600: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
d610: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
d620: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
d630: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
d640: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d650: 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f  e->nCell>0 || CO
d660: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
d670: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
d680: 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34  age(pPage, MIN(4
d690: 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d  , pPage->nFree -
d6a0: 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20   (2+nByte)));.  
d6b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
d6c0: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
d6d0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
d6e0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
d6f0: 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 32     assert( gap+2
d700: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
d710: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
d720: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
d730: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
d740: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
d750: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
d760: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
d770: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
d780: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
d790: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
d7a0: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
d7b0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
d7c0: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
d7d0: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
d7e0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
d7f0: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
d800: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
d810: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
d820: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
d830: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
d840: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
d850: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
d860: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
d870: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
d880: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
d890: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
d8a0: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
d8b0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
d8c0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d8d0: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
d8e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d900: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
d910: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
d920: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
d930: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
d940: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
d950: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
d960: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
d970: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
d980: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
d990: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
d9a0: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
d9b0: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
d9c0: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
d9d0: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
d9e0: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
d9f0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
da00: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
da10: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
da20: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
da30: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
da40: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
da50: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
da60: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
da70: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
da80: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
da90: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
daa0: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
dab0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
dac0: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
dad0: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
dae0: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
daf0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
db00: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
db10: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
db20: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
db30: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
db40: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
db50: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
db60: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
db70: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
db80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dba0: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
dbb0: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
dbc0: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
dbd0: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbf0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
dc00: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
dc10: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
dc40: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
dc50: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
dc60: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
dc90: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
dca0: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
dcb0: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
dcd0: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
dce0: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
dcf0: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
dd00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
dd10: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
dd20: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
dd30: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
dd40: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
dd50: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
dd60: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
dd70: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
dd80: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
dd90: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
dda0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
ddb0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
ddc0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
ddd0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
dde0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ddf0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
de00: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
de10: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
de20: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
de30: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
de40: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
de50: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
de60: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
de70: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
de80: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
de90: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
dea0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
deb0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
dec0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
ded0: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
dee0: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
def0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
df00: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
df10: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
df20: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
df30: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
df40: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
df50: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
df60: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
df70: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
df80: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
df90: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41  tsFlags & BTS_FA
dfa0: 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20  ST_SECURE ){.   
dfb0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53   memset(&data[iS
dfc0: 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29  tart], 0, iSize)
dfd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
dfe0: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
dff0: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
e000: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
e010: 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73  Find the .  ** s
e020: 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  pot on the list 
e030: 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f  where iStart sho
e040: 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e  uld be inserted.
e050: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
e060: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
e070: 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31    iPtr = hdr + 1
e080: 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74  ;.  if( data[iPt
e090: 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b  r+1]==0 && data[
e0a0: 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iPtr]==0 ){.    
e0b0: 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f  iFreeBlk = 0;  /
e0c0: 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74  * Shortcut for t
e0d0: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
e0e0: 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
e0f0: 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ty */.  }else{. 
e100: 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65     while( (iFree
e110: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e120: 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74  data[iPtr]))<iSt
e130: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
e140: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
e150: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e160: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72  iFreeBlk==0 ) br
e170: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  eak;.        ret
e180: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e190: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
e1a0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
e1b0: 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65      iPtr = iFree
e1c0: 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Blk;.    }.    i
e1d0: 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73  f( iFreeBlk>iLas
e1e0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
e1f0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
e200: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
e210: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
e220: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
e230: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
e240: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
e250: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
e260: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
e270: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
e280: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
e290: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
e2a0: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
e2b0: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
e2c0: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
e2d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
e2e0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
e2f0: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
e300: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
e310: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
e320: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
e330: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
e340: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
e350: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
e360: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
e370: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
e380: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
e390: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e3a0: 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
e3b0: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20  no);.      iEnd 
e3c0: 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74  = iFreeBlk + get
e3d0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
e3e0: 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20  eBlk+2]);.      
e3f0: 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65  if( iEnd > pPage
e400: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e410: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e ){.        ret
e420: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e430: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
e440: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
e450: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
e460: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
e470: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
e480: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
e490: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
e4a0: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
e4b0: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
e4c0: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
e4d0: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
e4e0: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
e4f0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
e500: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
e510: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
e520: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
e530: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
e540: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
e550: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
e560: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
e570: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
e580: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
e590: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
e5a0: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
e5b0: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
e5c0: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
e5d0: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
e5e0: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
e5f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e600: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
e610: 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d          nFrag +=
e620: 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e   iStart - iPtrEn
e630: 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65  d;.        iSize
e640: 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a   = iEnd - iPtr;.
e650: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
e660: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20   iPtr;.      }. 
e670: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72     }.    if( nFr
e680: 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  ag>data[hdr+7] )
e690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e6a0: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
e6b0: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 64 61  e->pgno);.    da
e6c0: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
e6d0: 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  ag;.  }.  if( iS
e6e0: 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26  tart==get2byte(&
e6f0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a  data[hdr+5]) ){.
e700: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
e710: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
e720: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
e730: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
e740: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
e750: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
e760: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
e770: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
e780: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
e790: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
e7a0: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
e7b0: 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74  Ptr!=hdr+1 ) ret
e7c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e7d0: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
e7e0: 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74 32 62 79  gno);.    put2by
e7f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  te(&data[hdr+1],
e800: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
e810: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
e820: 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20  dr+5], iEnd);.  
e830: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
e840: 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65  sert the new fre
e850: 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20  eblock into the 
e860: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20  freelist */.    
e870: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
e880: 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20  Ptr], iStart);. 
e890: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e8a0: 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65  a[iStart], iFree
e8b0: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
e8c0: 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b  te(&data[iStart+
e8d0: 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a  2], iSize);.  }.
e8e0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
e8f0: 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  = iOrigSize;.  r
e900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
e920: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
e930: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
e940: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
e950: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
e960: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
e970: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
e980: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
e990: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
e9a0: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
e9b0: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
e9c0: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
e9d0: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
e9e0: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
e9f0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
ea00: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
ea10: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
ea20: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
ea30: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
ea40: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
ea50: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
ea60: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
ea70: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
ea80: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
ea90: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
eaa0: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
eab0: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
eac0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
ead0: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
eae0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
eaf0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
eb00: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
eb10: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
eb20: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
eb30: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
eb40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
eb50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
eb60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
eb70: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
eb80: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
eb90: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
eba0: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
ebb0: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
ebc0: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
ebd0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
ebe0: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
ebf0: 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43  eaf;.  pPage->xC
ec00: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
ec10: 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70  zePtr;.  pBt = p
ec20: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
ec30: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
ec40: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
ec50: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a  NTKEY) ){.    /*
ec60: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec70: 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61  07291-35328 A va
ec80: 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20  lue of 5 (0x05) 
ec90: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
eca0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
ecb0: 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65  rior table b-tre
ecc0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
ecd0: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
ece0: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
ecf0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
ed00: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39  IDENCE-OF: R-269
ed10: 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65  00-09176 A value
ed20: 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65   of 13 (0x0d) me
ed30: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
ed40: 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61  a.    ** leaf ta
ed50: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
ed60: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ed70: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
ed80: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
ed90: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
eda0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
edb0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
edc0: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
edd0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
ede0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
edf0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
ee00: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
ee10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ee20: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
ee30: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
ee40: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
ee50: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f   = cellSizePtrNo
ee60: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70  Payload;.      p
ee70: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
ee80: 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
ee90: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  lPtrNoPayload;. 
eea0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
eeb0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
eec0: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
eed0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
eee0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
eef0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
ef00: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
ef10: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
ef20: 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33  CE-OF: R-43316-3
ef30: 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20  7308 A value of 
ef40: 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74  2 (0x02) means t
ef50: 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
ef60: 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e    ** interior in
ef70: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
ef80: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ef90: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
efa0: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
efb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35  ENCE-OF: R-59615
efc0: 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f  -42828 A value o
efd0: 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e  f 10 (0x0a) mean
efe0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
eff0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65      ** leaf inde
f000: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f010: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f020: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
f030: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
f040: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f050: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
f060: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
f070: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f080: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f090: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
f0a0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
f0b0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
f0c0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
f0d0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f0e0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
f0f0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f100: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
f110: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
f120: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
f130: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
f140: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
f150: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
f160: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
f170: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
f180: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
f190: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
f1a0: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
f1b0: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
f1c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f1d0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
f1e0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
f1f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
f200: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
f210: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
f220: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
f230: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
f240: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
f250: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
f260: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
f270: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
f280: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
f290: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
f2a0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
f2b0: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
f2c0: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
f2d0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
f2e0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
f2f0: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
f300: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
f310: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
f320: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
f330: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
f340: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
f350: 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  e){.  int pc;   
f360: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
f370: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
f380: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
f390: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  >aData[] */.  u8
f3a0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
f3b0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
f3c0: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
f3d0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
f3e0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
f3f0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
f400: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
f410: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
f420: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
f430: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
f440: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
f450: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
f460: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
f470: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
f480: 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65  .  u16 cellOffse
f490: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
f4a0: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
f4b0: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
f4c0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
f4d0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
f4e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
f4f0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
f500: 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
f510: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
f520: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
f530: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
f540: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
f550: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
f560: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
f570: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
f580: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ck offset */.  i
f590: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
f5a0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
f5b0: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
f5c0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
f5d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f5e0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
f5f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
f600: 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
f610: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f620: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
f630: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
f640: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
f650: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
f660: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
f670: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
f680: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
f690: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
f6a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
f6b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
f6c0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
f6d0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
f6e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
f6f0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
f700: 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
f710: 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d  t==0 );..  pBt =
f720: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68   pPage->pBt;.  h
f730: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
f740: 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
f750: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
f760: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f770: 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68  R-28594-02890 Th
f780: 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20  e one-byte flag 
f790: 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69  at offset 0 indi
f7a0: 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  cating.  ** the 
f7b0: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
f7c0: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64  . */.  if( decod
f7d0: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
f7e0: 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20 20  ta[hdr]) ){.    
f7f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f800: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
f810: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  ->pgno);.  }.  a
f820: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
f830: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
f840: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
f850: 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
f860: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
f870: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
f880: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
f890: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75 73 61  rflow = 0;.  usa
f8a0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
f8b0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
f8c0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
f8d0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
f8e0: 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63  r + 8 + pPage->c
f8f0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70  hildPtrSize;.  p
f900: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
f910: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
f920: 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
f930: 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65  llIdx = &data[ce
f940: 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70 50 61  llOffset];.  pPa
f950: 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
f960: 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
f970: 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a  ldPtrSize];.  /*
f980: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f990: 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20  58015-48175 The 
f9a0: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f9b0: 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73   at offset 5 des
f9c0: 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68 65  ignates.  ** the
f9d0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
f9e0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
f9f0: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
fa00: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
fa10: 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74  s.  ** interpret
fa20: 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a  ed as 65536. */.
fa30: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
fa40: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
fa50: 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56 49 44  r+5]);.  /* EVID
fa60: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32  ENCE-OF: R-37002
fa70: 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62  -32774 The two-b
fa80: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
fa90: 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68  ffset 3 gives th
faa0: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
fab0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
fac0: 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e  ge. */.  pPage->
fad0: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
fae0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
faf0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
fb00: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
fb10: 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  ){.    /* To man
fb20: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
fb30: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
fb40: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
fb50: 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  rupt */.    retu
fb60: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fb70: 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
fb80: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  no);.  }.  testc
fb90: 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
fba0: 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
fbb0: 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
fbc0: 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
fbd0: 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
fbe0: 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
fbf0: 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
fc00: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
fc10: 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
fc20: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
fc30: 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
fc40: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73  en the.  ** offs
fc50: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
fc60: 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c  ontent area will
fc70: 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20   equal the page 
fc80: 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20  size minus the. 
fc90: 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73   ** bytes of res
fca0: 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a  erved space. */.
fcb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
fcc0: 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d  >nCell>0 || top=
fcd0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43  =usableSize || C
fce0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20  ORRUPT_DB );..  
fcf0: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
fd00: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
fd10: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
fd20: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
fd30: 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68  .  ** of page wh
fd40: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
fd50: 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  l.  .  **.  ** T
fd60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
fd70: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
fd80: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
fd90: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
fda0: 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65  .  ** past the e
fdb0: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
fdc0: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
fdd0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
fde0: 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65 74 75  to be .  ** retu
fdf0: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
fe00: 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72  .  */.  iCellFir
fe10: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
fe20: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
fe30: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
fe40: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
fe50: 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
fe60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
fe70: 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
fe80: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
fe90: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
fea0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
feb0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
fec0: 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
fed0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
fee0: 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21 70  l */..    if( !p
fef0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
ff00: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f  llLast--;.    fo
ff10: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
ff20: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
ff30: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
ff40: 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65  Aligned(&data[ce
ff50: 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a  llOffset+i*2]);.
ff60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ff70: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
ff80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ff90: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
ffa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  );.      if( pc<
ffb0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
ffc0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
ffd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ffe0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
fff0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
10000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20       }.      sz 
10010 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
10020 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
10030 70 63 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  pc]);.      test
10040 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
10050 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
10060 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
10070 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10090 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
100a0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
100b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
100c0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
100d0 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20  CellLast++;.  } 
100e0 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20   ..  /* Compute 
100f0 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
10100 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
10110 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
10120 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
10130 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10140 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10150 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  1 gives the.  **
10160 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
10170 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
10180 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
10190 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
101a0 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62  re no.  ** freeb
101b0 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d  locks. */.  pc =
101c0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
101d0 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
101e0 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
101f0 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
10200 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
10210 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
10220 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29   */.  if( pc>0 )
10230 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20  {.    u32 next, 
10240 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
10250 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
10260 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
10270 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
10280 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
10290 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
102a0 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
102b0 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
102c0 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
102d0 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
102e0 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
102f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
10300 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10310 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
10320 6e 6f 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  no); .    }.    
10330 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
10340 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61    if( pc>iCellLa
10350 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
10360 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74   Freeblock off t
10370 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
10380 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
10390 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
103a0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
103b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
103c0 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32       next = get2
103d0 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
103e0 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
103f0 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
10400 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65  2]);.      nFree
10410 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
10420 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c  .      if( next<
10430 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65  =pc+size+3 ) bre
10440 61 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ak;.      pc = n
10450 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
10460 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  f( next>0 ){.   
10470 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20     /* Freeblock 
10480 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  not in ascending
10490 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
104a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
104b0 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
104c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
104d0 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28     if( pc+size>(
104e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61  unsigned int)usa
104f0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
10500 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f   /* Last freeblo
10510 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ck extends past 
10520 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  page end */.    
10530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10540 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
10550 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  ge->pgno);.    }
10560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
10570 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
10580 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
10590 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
105a0 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
105b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
105c0 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
105d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
105e0 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
105f0 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
10600 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
10610 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
10620 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
10630 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ze.  ** of the p
10640 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
10650 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
10660 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
10670 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65   also.  ** serve
10680 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
10690 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
106a0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
106b0 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a  cell-content.  *
106c0 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
106d0 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
106e0 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
106f0 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f  n the page..  */
10700 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61  .  if( nFree>usa
10710 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  bleSize ){.    r
10720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10730 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
10740 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 70 50  >pgno);.  }.  pP
10750 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
10760 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
10770 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67 65 2d  First);.  pPage-
10780 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72  >isInit = 1;.  r
10790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
107a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
107b0 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
107c0 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
107d0 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
107e0 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
107f0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
10800 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
10810 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
10820 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
10830 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
10840 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
10850 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
10860 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
10870 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
10880 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
10890 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
108a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
108b0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
108c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
108d0 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
108e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
108f0 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
10900 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
10910 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
10920 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10930 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
10940 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
10950 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
10960 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
10970 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
10980 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
10990 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
109a0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
109b0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
109c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
109d0 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29  TS_FAST_SECURE )
109e0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
109f0 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
10a00 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
10a10 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
10a20 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
10a30 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
10a40 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
10a50 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
10a60 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
10a70 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
10a80 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
10a90 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
10aa0 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
10ab0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
10ac0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
10ad0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
10ae0 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
10af0 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
10b00 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
10b10 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
10b20 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
10b30 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
10b40 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
10b50 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
10b60 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
10b70 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
10b80 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61  >aDataOfst = &da
10b90 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ta[pPage->childP
10ba0 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  trSize];.  pPage
10bb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
10bc0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
10bd0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
10be0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
10bf0 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
10c00 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
10c10 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
10c20 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
10c30 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
10c40 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
10c50 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
10c60 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
10c70 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
10c80 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
10c90 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
10ca0 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
10cb0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
10cc0 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
10cd0 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
10ce0 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
10cf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
10d00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
10d10 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
10d20 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
10d30 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
10d40 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e  f( pgno!=pPage->
10d50 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
10d60 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
10d70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10d80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61  DbPage);.    pPa
10d90 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
10da0 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65  bPage;.    pPage
10db0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
10dc0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
10dd0 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  gno;.    pPage->
10de0 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f  hdrOffset = pgno
10df0 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
10e00 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
10e10 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  ge->aData==sqlit
10e20 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10e30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
10e40 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
10e50 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
10e60 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
10e70 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10e80 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
10e90 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
10ea0 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
10eb0 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20  ded.  See also: 
10ec0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
10ed0 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge()..**.** If t
10ee0 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  he PAGER_GET_NOC
10ef0 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73  ONTENT flag is s
10f00 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
10f10 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
10f20 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f  .** about the co
10f30 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
10f40 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
10f50 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
10f60 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
10f70 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
10f80 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
10f90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
10fa0 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
10fb0 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
10fc0 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
10fd0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
10fe0 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
10ff0 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
11000 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
11010 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
11020 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
11030 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
11040 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
11050 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
11060 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
11070 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
11080 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
11090 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
110a0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
110b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
110c0 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
110d0 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
110e0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
110f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
11100 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
11110 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
11120 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11130 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
11140 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
11150 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
11160 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
11170 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
11180 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
11190 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
111a0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
111b0 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
111c0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
111d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
111e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
111f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
11200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
11210 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
11220 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
11230 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29  &pDbPage, flags)
11240 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
11250 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
11260 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
11270 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
11280 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
11290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
112a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
112b0 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
112c0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
112d0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
112e0 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
112f0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
11300 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
11310 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
11320 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
11330 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
11340 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
11350 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
11360 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
11370 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
11380 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
11390 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
113a0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
113b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
113c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
113d0 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
113e0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
113f0 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
11400 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
11410 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
11420 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
11430 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
11440 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
11450 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
11460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11470 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
11480 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11490 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
114a0 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
114b0 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
114c0 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
114d0 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
114e0 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
114f0 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
11500 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
11510 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
11520 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
11530 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
11540 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11550 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
11560 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
11570 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
11580 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
11590 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
115a0 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
115b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
115c0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
115d0 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
115e0 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
115f0 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
11600 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
11610 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
11620 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
11630 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
11640 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
11650 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
11660 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
11670 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
11680 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
11690 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
116a0 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
116b0 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
116c0 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
116d0 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
116e0 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
116f0 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
11700 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
11710 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
11720 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11730 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
11740 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
11750 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
11760 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
11770 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
11780 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
11790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
117a0 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
117b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
117d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
117e0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
117f0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
11800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11810 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
11820 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
11830 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
11840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
11850 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
11860 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
11870 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11890 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
118a0 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
118b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
118c0 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
118d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
118e0 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
118f0 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
11900 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
11910 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
11920 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11930 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11940 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11950 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
11960 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67  ge==&pCur->apPag
11970 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
11980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
11990 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79  ==0 || bReadOnly
119a0 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  ==pCur->curPager
119b0 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72  Flags );.  asser
119c0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43  t( pCur==0 || pC
119d0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a  ur->iPage>0 );..
119e0 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65    if( pgno>btree
119f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
11a00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11a10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11a20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
11a30 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
11a40 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
11a50 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
11a60 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
11a70 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
11a80 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69   bReadOnly);.  i
11a90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  f( rc ){.    got
11aa0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
11ab0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70  _error;.  }.  *p
11ac0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
11ad0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
11ae0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
11af0 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
11b00 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
11b10 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d     btreePageFrom
11b20 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
11b30 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20  pgno, pBt);.    
11b40 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
11b50 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
11b60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11b70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
11b80 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
11b90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74  ;.      goto get
11ba0 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11bb0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  r;.    }.  }.  a
11bc0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
11bd0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
11be0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
11bf0 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  ge)->aData==sqli
11c00 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
11c10 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
11c20 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61  * If obtaining a
11c30 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20   child page for 
11c40 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73  a cursor, we mus
11c50 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  t verify that th
11c60 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63  e page is.  ** c
11c70 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
11c80 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f  he root page. */
11c90 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28  .  if( pCur && (
11ca0 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c  (*ppPage)->nCell
11cb0 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  <1 || (*ppPage)-
11cc0 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63  >intKey!=pCur->c
11cd0 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20  urIntKey) ){.   
11ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
11cf0 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b  RUPT_PGNO(pgno);
11d00 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
11d10 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67  (*ppPage);.    g
11d20 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11d30 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
11d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11d50 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67  ;..getAndInitPag
11d60 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  e_error:.  if( p
11d70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67  Cur ) pCur->iPag
11d80 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e--;.  testcase(
11d90 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
11da0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
11db0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
11dc0 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
11dd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
11de0 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
11df0 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
11e00 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
11e10 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
11e20 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
11e30 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
11e40 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
11e50 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
11e60 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
11e70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
11e80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11e90 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
11ea0 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
11eb0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
11ec0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
11ed0 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
11ee0 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
11ef0 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
11f00 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11f10 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
11f20 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
11f30 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
11f40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11f50 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11f60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11f70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
11f80 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
11f90 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
11fa0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
11fb0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
11fc0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
11fd0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
11fe0 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ull(pPage);.}../
11ff0 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
12000 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
12010 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
12020 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
12030 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
12040 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
12050 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
12060 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
12070 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
12080 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
12090 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
120a0 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
120b0 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
120c0 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
120d0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
120e0 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
120f0 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
12100 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
12110 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
12120 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
12130 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
12140 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
12150 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12160 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
12170 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
12180 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
12190 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
121a0 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
121b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
121c0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
121d0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
121e0 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
121f0 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
12200 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
12210 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
12220 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
12230 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
12250 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
12260 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
12270 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
12280 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
12290 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
122a0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
122b0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
122c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
122d0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
122e0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
122f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12300 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
12310 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12320 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
12330 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
12340 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
12350 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
12360 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
12370 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
12380 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
12390 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
123a0 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
123b0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
123c0 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
123d0 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
123e0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
123f0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
12400 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
12410 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
12420 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
12430 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
12440 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
12450 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
12460 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
12470 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12480 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
12490 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
124a0 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
124b0 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
124c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
124d0 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
124e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
124f0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
12500 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
12510 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
12520 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
12530 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12540 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12550 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
12560 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12570 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
12580 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
12590 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
125a0 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
125b0 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
125c0 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
125d0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
125e0 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
125f0 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
12600 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
12610 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
12620 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
12630 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
12640 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
12650 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
12660 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
12670 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
12680 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
12690 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
126a0 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
126b0 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
126c0 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
126d0 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
126e0 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
126f0 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
12700 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
12710 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
12720 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
12730 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
12740 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
12750 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
12760 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
12770 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
12780 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
12790 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
127a0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
127b0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
127c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
127d0 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
127e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
127f0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
12800 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12810 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
12820 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
12830 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
12840 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
12850 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
12860 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
12870 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
12880 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
12890 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
128a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
128b0 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
128c0 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61  s NULL.** then a
128d0 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  n ephemeral data
128e0 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e  base is created.
128f0 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20    The ephemeral 
12900 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a  database might.*
12910 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79  * be exclusively
12920 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69   in memory, or i
12930 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69  t might use a di
12940 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20  sk-based memory 
12950 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72  cache..** Either
12960 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65   way, the epheme
12970 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c  ral database wil
12980 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
12990 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77  ly deleted .** w
129a0 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
129b0 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
129c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
129d0 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
129e0 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
129f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
12a00 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
12a10 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
12a20 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
12a30 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
12a40 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73  **.** The "flags
12a50 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
12a60 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69   bitmask that mi
12a70 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73  ght contain bits
12a80 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f   like.** BTREE_O
12a90 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
12aa0 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e  or BTREE_MEMORY.
12ab0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
12ac0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
12ad0 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
12ae0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
12af0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
12b00 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
12b10 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
12b20 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
12b30 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
12b40 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
12b50 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
12b60 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
12b70 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
12b80 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
12b90 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
12ba0 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
12bb0 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
12bc0 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
12bd0 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
12be0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12bf0 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  reeOpen(.  sqlit
12c00 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
12c10 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
12c20 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65   for this b-tree
12c30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
12c40 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
12c50 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
12c60 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
12c70 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
12c80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12c90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12ca0 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
12cb0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
12cc0 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
12cd0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12ce0 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
12cf0 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
12d00 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
12d10 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
12d20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
12d30 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
12d40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
12d50 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
12d60 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
12d70 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
12d80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12d90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
12da0 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
12db0 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
12dc0 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
12df0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
12e00 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
12e10 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
12e20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
12e30 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
12e40 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
12e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12e70 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
12e80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
12e90 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
12ec0 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
12ed0 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
12ee0 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
12ef0 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
12f00 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
12f10 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
12f20 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
12f30 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
12f40 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
12f50 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
12f60 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
12f70 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
12f80 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
12f90 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
12fa0 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
12fb0 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
12fc0 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
12fd0 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
12fe0 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
12ff0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
13000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
13010 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
13020 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
13030 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
13040 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
13050 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
13060 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
13070 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
130a0 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
130b0 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20  nMemory(db)).   
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73      || (vfsFlags
130e0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
130f0 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
13100 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
13110 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13120 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
13130 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13140 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
13150 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
13160 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
13170 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
13180 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
13190 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
131a0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
131b0 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
131c0 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
131d0 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
131e0 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
131f0 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
13200 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
13210 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
13220 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
13230 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
13240 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
13250 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
13260 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
13270 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
13280 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
13290 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
132a0 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
132b0 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
132c0 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
132d0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
132e0 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
132f0 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
13300 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
13310 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
13320 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
13330 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
13340 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
13350 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
13360 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
13370 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
13380 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
13390 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
133a0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e  _BKPT;.  }.  p->
133b0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
133c0 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
133d0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
133e0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
133f0 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
13400 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
13410 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
13420 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
13430 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13440 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
13450 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
13460 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
13470 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
13480 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
13490 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
134a0 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
134b0 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
134c0 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
134d0 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
134e0 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
134f0 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
13500 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
13510 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
13520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
13530 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
13540 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
13550 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
13560 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
13570 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
13580 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
13590 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
135a0 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
135b0 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
135c0 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
135d0 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
135e0 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
135f0 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
13600 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
13610 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13620 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
13630 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
13640 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
13650 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
13660 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
13670 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
13680 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13690 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
136a0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
136b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
136c0 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
136d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75        memcpy(zFu
136e0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c  llPathname, zFil
136f0 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65  ename, nFilename
13700 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13710 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13720 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
13730 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
13740 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68         nFullPath
13770 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
13780 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
13790 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
137a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
137b0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
137c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
137d0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
137e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
137f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13800 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
13810 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74  ADSAFE.      mut
13820 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
13830 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
13840 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
13850 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
13860 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13870 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
13880 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
13890 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
138a0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
138b0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
138c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
138d0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
138e0 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ared);.#endif.  
138f0 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
13900 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
13910 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
13920 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
13930 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
13940 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13950 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
13960 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
13970 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
13980 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
13990 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
139a0 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  , 0)).          
139b0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
139c0 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
139d0 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
139e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
139f0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
13a00 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
13a10 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
13a20 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
13a30 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
13a40 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
13a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13a60 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
13a70 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
13a80 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
13a90 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13aa0 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13ab0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
13ac0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13ad0 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
13ae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13af0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
13b00 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
13b10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13b20 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13b30 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
13b40 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
13b50 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
13b60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
13b70 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
13b80 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
13b90 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
13ba0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13bd0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13be0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
13bf0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
13c00 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
13c10 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
13c20 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
13c30 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
13c40 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
13c50 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
13c60 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
13c70 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
13c80 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
13c90 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
13ca0 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
13cb0 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
13cc0 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
13cd0 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
13ce0 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
13cf0 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
13d00 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
13d10 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
13d20 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
13d30 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
13d40 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
13d50 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
13d60 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
13d70 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
13d80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
13d90 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
13da0 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
13db0 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
13dc0 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
13dd0 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
13de0 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
13df0 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
13e00 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
13e10 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
13e20 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
13e30 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
13e40 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
13e50 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
13e60 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73  4)==8 );.    ass
13e70 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
13e80 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
13e90 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
13ea0 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
13eb0 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
13ec0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13ed0 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
13ee0 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
13ef0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
13f00 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
13f10 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
13f20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13f30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13f40 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
13f50 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13f60 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
13f70 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
13f80 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
13f90 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d        sizeof(Mem
13fc0 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66  Page), flags, vf
13fd0 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
13fe0 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
13ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14000 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14010 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
14020 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
14030 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
14040 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
14050 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
14060 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
14070 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
14080 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
14090 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
140a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
140b0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
140c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
140d0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
140e0 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
140f0 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
14100 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
14110 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
14120 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
14130 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
14140 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
14150 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
14160 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
14170 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
14180 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
14190 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
141a0 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
141b0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
141c0 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
141d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
141e0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
141f0 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  E).    pBt->btsF
14200 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
14210 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66  RE_DELETE;.#elif
14220 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14230 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c 45  FAST_SECURE_DELE
14240 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
14250 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45  Flags |= BTS_OVE
14260 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20  RWRITE;.#endif. 
14270 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
14280 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
14290 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
142a0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
142b0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
142c0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
142d0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
142e0 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
142f0 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
14300 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
14310 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
14320 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
14330 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  /.    pBt->pageS
14340 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
14350 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
14360 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
14370 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
14380 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
14390 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
143a0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
143b0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
143c0 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
143d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
143e0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
143f0 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
14400 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14410 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
14420 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
14430 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
14440 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
14450 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
14460 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
14470 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
14480 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
14490 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
144a0 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
144b0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
144c0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
144d0 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
144e0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
144f0 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
14500 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
14510 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
14520 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
14530 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
14540 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
14550 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
14560 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
14570 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
14580 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
14590 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
145a0 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
145b0 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
145c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
145d0 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
145e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
145f0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
14600 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
14610 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
14620 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
14630 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
14640 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
14650 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
14660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
14670 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
14680 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
14690 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
146a0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
146b0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
146c0 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
146d0 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
146e0 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
146f0 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
14700 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
14710 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
14720 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65  er. */.      nRe
14730 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
14740 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
14750 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
14760 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
14770 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14780 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14790 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
147a0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
147b0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
147c0 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
147d0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
147e0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
147f0 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14800 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
14810 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
14820 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14830 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
14840 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
14850 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
14860 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
14870 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
14880 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
14890 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
148a0 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
148b0 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
148c0 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
148d0 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
148e0 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
148f0 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
14900 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
14910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14920 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14930 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14940 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
14950 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
14960 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
14970 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
14980 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
14990 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
149a0 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
149b0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
149c0 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
149d0 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
149e0 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
149f0 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45  ed; ).      MUTE
14a00 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
14a10 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
14a20 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14a30 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14a40 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
14a50 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
14a60 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
14a70 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
14a80 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
14a90 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
14aa0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14ab0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
14ac0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14ad0 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
14ae0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14af0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14b00 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
14b10 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14b20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14b30 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14b40 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14b50 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
14b60 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
14b70 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
14b80 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
14b90 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
14ba0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
14bb0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
14bc0 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
14bd0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14be0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14bf0 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
14c00 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
14c10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14c20 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
14c30 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14c40 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
14c50 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
14c60 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
14c70 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
14c80 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
14c90 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
14ca0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
14cb0 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
14cc0 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
14cd0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
14ce0 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
14cf0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
14d00 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
14d10 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
14d20 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
14d30 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
14d40 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
14d50 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
14d60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
14d70 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
14d80 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
14d90 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
14da0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
14db0 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
14dc0 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
14dd0 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
14de0 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28  ( (uptr)p->pBt<(
14df0 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29  uptr)pSib->pBt )
14e00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
14e10 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
14e20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
14e30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
14e40 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
14e50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14e60 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14e70 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28  pSib->pNext && (
14e80 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74  uptr)pSib->pNext
14e90 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70  ->pBt<(uptr)p->p
14ea0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14eb0 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
14ec0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
14ed0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
14ee0 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
14ef0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
14f00 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
14f10 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
14f20 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
14f30 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
14f40 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
14f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14f60 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
14f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14f80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14f90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
14fa0 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
14fb0 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
14fc0 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
14fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14fe0 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
14ff0 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
15000 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
15010 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
15020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15030 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
15040 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15050 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
15060 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
15070 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
15080 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  *pFile;..    /* 
15090 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
150a0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
150b0 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
150c0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
150d0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
150e0 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
150f0 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
15100 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
15110 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
15120 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
15130 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
15140 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
15150 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
15160 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
15170 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
15180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
15190 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
151a0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
151b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
151c0 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
151d0 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73  }..    pFile = s
151e0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
151f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
15200 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
15210 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73  thods ){.      s
15220 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
15230 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53  rolHint(pFile, S
15240 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c  QLITE_FCNTL_PDB,
15250 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62   (void*)&pBt->db
15260 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
15270 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
15280 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15290 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
152a0 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
152b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
152c0 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
152d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
152e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
152f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e  sqlite3BtreeConn
15300 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42  ectionCount(*ppB
15310 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74  tree)>0 );.  ret
15320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15330 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
15340 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
15350 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
15360 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
15370 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
15380 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
15390 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
153a0 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
153b0 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
153c0 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
153d0 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
153e0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
153f0 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
15400 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
15410 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
15420 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
15430 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15440 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15450 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15460 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
15470 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
15480 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
15490 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
154a0 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
154b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
154c0 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
154d0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
154e0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
154f0 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
15500 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15510 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
15520 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
15530 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15540 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
15550 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
15560 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
15570 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
15580 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
15590 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
155a0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
155b0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
155c0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
155d0 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
155e0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
155f0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
15600 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
15610 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
15620 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
15630 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
15640 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
15650 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
15660 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
15670 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
15680 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
15690 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
156a0 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
156b0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
156c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
156d0 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
156e0 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
156f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
15700 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
15710 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
15720 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
15730 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
15740 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
15750 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
15760 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
15770 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
15780 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
15790 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
157a0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
157b0 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
157c0 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
157d0 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
157e0 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
157f0 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
15800 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
15810 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
15820 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15830 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
15840 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
15850 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
15860 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
15870 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
15880 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
15890 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
158a0 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
158b0 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
158c0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
158d0 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
158e0 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
158f0 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
15900 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
15910 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
15920 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
15930 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
15940 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
15950 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
15960 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
15970 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
15980 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
15990 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
159a0 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
159b0 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
159c0 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
159d0 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
159e0 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
159f0 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
15a00 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
15a10 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
15a20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
15a30 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
15a40 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
15a50 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
15a60 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
15a70 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
15a80 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
15a90 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
15aa0 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
15ab0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
15ac0 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
15ad0 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
15ae0 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
15af0 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
15b00 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15b10 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
15b20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
15b30 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
15b40 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
15b50 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
15b60 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
15b70 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
15b80 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
15b90 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
15ba0 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
15bb0 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
15bc0 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
15bd0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
15be0 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
15bf0 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
15c00 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
15c10 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
15c20 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
15c30 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15c40 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
15c50 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
15c60 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
15c70 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
15c80 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
15c90 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
15ca0 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
15cb0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
15cc0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15cd0 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
15ce0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
15cf0 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
15d00 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15d10 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
15d20 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
15d30 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
15d40 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
15d50 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
15d60 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
15d70 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
15d80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15d90 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
15da0 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
15db0 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
15dc0 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
15dd0 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
15de0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15df0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15e00 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15e10 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15e20 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
15e30 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
15e40 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
15e50 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
15e60 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
15e70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
15e80 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
15e90 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
15ea0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
15eb0 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
15ec0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
15ed0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
15ee0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
15ef0 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
15f00 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
15f10 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
15f20 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15f30 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
15f40 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
15f50 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
15f60 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
15f70 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
15f80 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
15f90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15fa0 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
15fb0 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
15fc0 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
15fd0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
15fe0 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
15ff0 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
16000 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
16010 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
16020 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
16030 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
16040 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
16050 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16060 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
16070 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
16080 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
16090 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
160a0 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
160b0 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
160c0 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
160d0 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
160e0 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
160f0 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
16100 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
16110 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
16120 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
16130 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
16140 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
16150 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
16160 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
16170 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
16180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
16190 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
161a0 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20  ger, p->db);.   
161b0 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
161c0 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
161d0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
161e0 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
161f0 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
16200 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16210 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
16220 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
16230 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
16240 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16250 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
16260 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16270 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
16280 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
16290 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
162a0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
162b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
162c0 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
162d0 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
162e0 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
162f0 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
16300 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
16310 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
16320 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
16330 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16340 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16350 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20  he "soft" limit 
16360 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
16370 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
16380 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61  che..** Unused a
16390 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61  nd unmodified pa
163a0 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79  ges will be recy
163b0 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  cled when the nu
163c0 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73  mber of.** pages
163d0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78   in the cache ex
163e0 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20  ceeds this soft 
163f0 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20  limit.  But the 
16400 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
16410 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ache is allowed 
16420 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74  to grow larger t
16430 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69  han this limit i
16440 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  f it contains.**
16450 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20   dirty pages or 
16460 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61  pages still in a
16470 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ctive use..*/.in
16480 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
16490 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
164a0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
164b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
164c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
164d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
164e0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
164f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16500 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16510 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16520 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
16530 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16540 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16550 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16570 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16580 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74  he "spill" limit
16590 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
165a0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
165b0 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ache..** If the 
165c0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
165d0 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d  exceeds this lim
165e0 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74  it during a writ
165f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  e transaction,.*
16600 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68  * the pager migh
16610 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70  t attempt to "sp
16620 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68  ill" pages to th
16630 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20  e journal early 
16640 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66  in.** order to f
16650 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a  ree up memory..*
16660 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
16670 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63  eturned is the c
16680 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
16690 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70  e.  If zero is p
166a0 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61  assed.** as an a
166b0 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e  rgument, no chan
166c0 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
166d0 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73  the spill size s
166e0 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73  etting, so.** us
166f0 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20  ing mxPage of 0 
16700 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72  is a way to quer
16710 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  y the current sp
16720 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74  ill size..*/.int
16730 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
16740 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20  SpillSize(Btree 
16750 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
16760 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16770 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
16780 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
16790 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
167a0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
167b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
167c0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65  eeEnter(p);.  re
167d0 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  s = sqlite3Pager
167e0 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74  SetSpillsize(pBt
167f0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16800 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16810 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16820 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20  urn res;.}..#if 
16830 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
16840 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
16850 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
16860 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
16870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16880 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
16890 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
168a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
168b0 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
168c0 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
168d0 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
168e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
168f0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16900 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16910 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16920 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16930 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16940 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16950 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
16960 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
16970 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16980 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16990 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
169a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
169b0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
169c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
169d0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
169e0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
169f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
16a00 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
16a10 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
16a20 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
16a30 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
16a40 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
16a50 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
16a60 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
16a70 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
16a80 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
16a90 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
16aa0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
16ab0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
16ac0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
16ad0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
16ae0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
16af0 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
16b00 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
16b10 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
16b20 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
16b30 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
16b40 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
16b50 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
16b60 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
16b70 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
16b80 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16b90 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
16ba0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
16bb0 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
16bc0 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16be0 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
16bf0 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
16c00 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
16c10 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
16c20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
16c30 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
16c40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16c50 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16c60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16c70 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16c80 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16c90 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16cb0 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
16cc0 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
16cd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16ce0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16cf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
16d00 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
16d10 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
16d20 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
16d30 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
16d40 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
16d50 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
16d60 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
16d70 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
16d80 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
16d90 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
16da0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
16db0 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
16dc0 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
16dd0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
16de0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
16df0 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
16e00 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
16e10 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
16e20 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
16e30 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
16e40 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
16e50 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
16e60 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
16e70 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
16e80 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
16e90 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
16ea0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
16eb0 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
16ec0 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
16ed0 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
16ee0 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
16ef0 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
16f00 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
16f10 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
16f20 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
16f30 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
16f40 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
16f50 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
16f60 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
16f70 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
16f80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16f90 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
16fa0 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
16fb0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
16fc0 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
16fd0 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
16fe0 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
16ff0 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
17000 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
17010 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
17020 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
17030 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
17040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17050 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
17060 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
17070 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
17080 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
17090 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
170a0 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
170b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
170c0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
170d0 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
170e0 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
170f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17100 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ;.#if SQLITE_HAS
17110 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65  _CODEC.  if( nRe
17120 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d  serve>pBt->optim
17130 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d  alReserve ) pBt-
17140 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
17150 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a  = (u8)nReserve;.
17160 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
17170 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
17180 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
17190 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
171a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
171b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
171c0 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
171d0 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
171e0 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
171f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
17200 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
17210 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
17220 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
17230 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
17240 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
17250 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
17260 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
17270 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
17280 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
17290 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
172a0 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
172b0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
172c0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
172d0 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
172e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
172f0 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
17300 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
17310 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
17320 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
17330 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
17340 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
17350 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
17360 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
17370 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
17380 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
17390 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
173a0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
173b0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
173c0 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
173d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
173e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
173f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17400 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
17410 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
17420 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17430 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
17440 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
17450 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
17460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17470 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
17480 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
17490 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
174a0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
174b0 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
174c0 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
174d0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
174e0 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
174f0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
17500 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
17510 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
17520 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
17530 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
17540 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
17550 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
17560 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
17570 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
17580 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
17590 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
175a0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
175b0 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
175c0 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
175d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
175e0 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
175f0 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
17600 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
17610 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
17620 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
17630 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
17640 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
17650 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
17660 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
17670 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
17680 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
17690 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
176a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
176b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
176c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
176d0 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
176e0 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
176f0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  ableSize;.  retu
17700 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn n;.}../*.** R
17710 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17720 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
17730 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
17740 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
17750 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
17760 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
17770 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
17780 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
17790 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
177a0 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
177b0 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  nsions..**.** If
177c0 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45   SQLITE_HAS_MUTE
177d0 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  X is defined the
177e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74  n the number ret
177f0 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20  urned is the.** 
17800 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63  greater of the c
17810 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20  urrent reserved 
17820 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61  space and the ma
17830 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a  ximum requested.
17840 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65  ** reserve space
17850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17860 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52  BtreeGetOptimalR
17870 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
17880 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
17890 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
178a0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
178b0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
178c0 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65  oMutex(p);.#ifde
178d0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
178e0 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42  EC.  if( n<p->pB
178f0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17900 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  e ) n = p->pBt->
17910 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a  optimalReserve;.
17920 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
17930 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17940 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
17950 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
17960 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
17970 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
17980 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
17990 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
179a0 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
179b0 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
179c0 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
179d0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
179e0 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
179f0 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
17a00 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
17a10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17a20 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
17a30 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
17a40 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
17a50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17a60 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
17a70 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
17a80 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
17a90 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
17aa0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17ab0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
17ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
17ad0 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  e the values for
17ae0 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
17af0 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f  DELETE and BTS_O
17b00 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a 0a  VERWRITE flags:.
17b10 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  **.**    newFlag
17b20 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20 42  ==0       Both B
17b30 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17b40 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
17b50 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  TE are cleared.*
17b60 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20  *    newFlag==1 
17b70 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45        BTS_SECURE
17b80 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64 20  _DELETE set and 
17b90 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73  BTS_OVERWRITE is
17ba0 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e   cleared.**    n
17bb0 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20 20  ewFlag==2       
17bc0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17bd0 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42 54  E cleared and BT
17be0 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 73  S_OVERWRITE is s
17bf0 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  et.**    newFlag
17c00 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68 61  ==(-1)    No cha
17c10 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nges.**.** This 
17c20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
17c30 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46 6c  a query if newFl
17c40 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ag is less than 
17c50 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  zero.**.** With 
17c60 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73 65  BTS_OVERWRITE se
17c70 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  t, deleted conte
17c80 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  nt is overwritte
17c90 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a  n by zeros, but.
17ca0 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  ** freelist leaf
17cb0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 77   pages are not w
17cc0 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74  ritten back to t
17cd0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
17ce0 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65  us in-page.** de
17cf0 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73  leted content is
17d00 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66 72   cleared, but fr
17d10 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20 63  eelist deleted c
17d20 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a  ontent is not..*
17d30 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53 45  *.** With BTS_SE
17d40 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65  CURE_DELETE, ope
17d50 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42  ration is like B
17d60 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69 74  TS_OVERWRITE wit
17d70 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a  h the addition.*
17d80 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74 20  * that freelist 
17d90 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20 77  leaf pages are w
17da0 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
17db0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
17dc0 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65  ncreasing.** the
17dd0 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20   amount of disk 
17de0 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  I/O..*/.int sqli
17df0 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
17e00 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
17e10 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
17e20 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
17e30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
17e40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17e50 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42  (p);.  assert( B
17e60 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42 54  TS_OVERWRITE==BT
17e70 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a  S_SECURE_DELETE*
17e80 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42  2 );.  assert( B
17e90 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d 3d  TS_FAST_SECURE==
17ea0 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c 42  (BTS_OVERWRITE|B
17eb0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17ec0 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  ) );.  if( newFl
17ed0 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
17ee0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
17ef0 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52   ~BTS_FAST_SECUR
17f00 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  E;.    p->pBt->b
17f10 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
17f20 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77  ECURE_DELETE*new
17f30 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20  Flag;.  }.  b = 
17f40 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  (p->pBt->btsFlag
17f50 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43  s & BTS_FAST_SEC
17f60 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45 5f  URE)/BTS_SECURE_
17f70 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74 65  DELETE;.  sqlite
17f80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17f90 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f    return b;.}../
17fa0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17fb0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
17fc0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
17fd0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
17fe0 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
17ff0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
18000 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
18010 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
18020 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
18030 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
18040 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
18050 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
18060 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
18070 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
18080 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
18090 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
180a0 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
180b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
180c0 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
180d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
180e0 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
180f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18100 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
18110 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
18120 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
18130 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
18140 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18150 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
18160 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
18170 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
18180 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
18190 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
181a0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
181b0 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f  XED)!=0 && (av ?
181c0 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
181d0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
181e0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
181f0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
18200 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
18210 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
18220 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
18230 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
18240 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18250 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18260 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
18270 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18280 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
18290 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
182a0 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
182b0 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
182c0 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
182d0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
182e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
182f0 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
18300 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
18310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18320 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
18330 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
18340 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
18350 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
18360 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18370 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
18380 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
18390 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
183a0 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
183b0 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
183c0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
183d0 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
183e0 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
183f0 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
18400 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18410 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
18420 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
18430 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
18440 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61 66   not set the saf
18450 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety-level for th
18460 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
18470 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20  ection.** using 
18480 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e  "PRAGMA synchron
18490 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68 65  ous", and if the
184a0 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69 73   safety-level is
184b0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
184c0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
184d0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
184e0 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20  function as the 
184f0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
18500 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a  ,.** set it so..
18510 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  */.#if SQLITE_DE
18520 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55  FAULT_SYNCHRONOU
18530 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  S!=SQLITE_DEFAUL
18540 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55  T_WAL_SYNCHRONOU
18550 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  S.static void se
18560 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
18570 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
18580 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  u8 safety_level)
18590 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
185a0 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66  .  Db *pDb;.  if
185b0 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d  ( (db=pBt->db)!=
185c0 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44  0 && (pDb=db->aD
185d0 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  b)!=0 ){.    whi
185e0 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  le( pDb->pBt==0 
185f0 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74  || pDb->pBt->pBt
18600 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20  !=pBt ){ pDb++; 
18610 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62  }.    if( pDb->b
18620 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20  SyncSet==0 .    
18630 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f   && pDb->safety_
18640 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65  level!=safety_le
18650 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62  vel .     && pDb
18660 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20  !=&db->aDb[1] . 
18670 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d     ){.      pDb-
18680 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
18690 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20  safety_level;.  
186a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
186b0 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
186c0 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ager,.          
186d0 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
186e0 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  l | (db->flags &
186f0 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
18700 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  K));.    }.  }.}
18710 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18720 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
18730 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65  ag(pBt,safety_le
18740 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  vel).#endif../*.
18750 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
18760 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
18770 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18780 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
18790 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
187a0 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
187b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
187c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
187d0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
187e0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
187f0 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
18800 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
18810 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
18820 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
18830 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
18840 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
18850 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
18860 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
18870 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
18880 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
18890 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
188a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
188b0 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
188c0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
188d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
188e0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
188f0 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
18900 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
18910 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
18920 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
18930 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
18940 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
18950 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18960 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
18970 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
18980 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
18990 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
189a0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
189b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
189c0 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
189d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
189e0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
189f0 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
18a00 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
18a10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18a20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
18a30 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
18a40 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
18a50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18a60 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
18a70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
18a80 74 2d 3e 64 62 2d 3e 72 65 61 64 6f 6e 6c 79 54  t->db->readonlyT
18a90 72 61 6e 73 29 3b 0a 20 20 69 66 28 20 72 63 21  rans);.  if( rc!
18aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18ab0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
18ac0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
18ad0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
18ae0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18af0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18b00 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
18b10 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
18b20 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
18b30 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
18b40 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
18b50 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
18b60 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
18b70 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
18b80 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
18b90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
18ba0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
18bb0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
18bc0 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
18bd0 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
18be0 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
18bf0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
18c00 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
18c10 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
18c20 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
18c30 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
18c40 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
18c50 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
18c60 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
18c70 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
18c80 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
18c90 3b 0a 20 20 20 20 75 38 20 69 31 38 20 3d 20 70  ;.    u8 i18 = p
18ca0 61 67 65 31 5b 31 38 5d 3b 0a 20 20 20 20 75 38  age1[18];.    u8
18cb0 20 69 31 39 20 3d 20 70 61 67 65 31 5b 31 39 5d   i19 = page1[19]
18cc0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18cd0 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20  SERVER_EDITION. 
18ce0 20 20 20 69 66 28 20 69 31 38 3d 3d 69 31 39 20     if( i18==i19 
18cf0 26 26 20 69 31 38 3e 32 20 29 7b 0a 20 20 20 20  && i18>2 ){.    
18d00 20 20 69 31 38 20 2d 3d 20 32 3b 0a 20 20 20 20    i18 -= 2;.    
18d10 20 20 69 31 39 20 2d 3d 20 32 3b 0a 20 20 20 20    i19 -= 2;.    
18d20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 63  }.#endif..    rc
18d30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
18d40 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
18d50 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
18d60 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
18d70 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
18d80 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
18d90 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
18da0 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
18db0 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
18dc0 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
18dd0 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
18de0 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
18df0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
18e00 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
18e10 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
18e20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18e30 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18e40 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
18e50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
18e60 20 20 69 66 28 20 69 31 38 3e 31 20 29 7b 0a 20    if( i18>1 ){. 
18e70 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
18e80 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
18e90 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
18ea0 66 28 20 69 31 39 3e 31 20 29 7b 0a 20 20 20 20  f( i19>1 ){.    
18eb0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18ec0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18ed0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 69 31  #else.    if( i1
18ee0 38 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  8>2 ){.      pBt
18ef0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18f00 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
18f10 20 7d 0a 20 20 20 20 69 66 28 20 69 31 39 3e 32   }.    if( i19>2
18f20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
18f30 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18f40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18f50 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
18f60 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
18f70 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
18f80 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
18f90 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
18fa0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
18fb0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
18fc0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
18fd0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
18fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18ff0 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
19000 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
19010 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
19020 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
19030 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
19040 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
19050 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
19060 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
19070 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
19080 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
19090 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
190a0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
190b0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
190c0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
190d0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
190e0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
190f0 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
19100 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19110 20 69 66 28 20 69 31 39 3d 3d 32 20 26 26 20 28   if( i19==2 && (
19120 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19130 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
19140 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
19150 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
19160 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
19170 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
19180 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
19190 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
191a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
191b0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
191c0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
191d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
191e0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
191f0 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
19200 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
19210 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20  NOUS+1);.       
19220 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
19230 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
19240 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
19250 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
19260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19280 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19290 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c  _NOTADB;.    }el
192a0 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66  se{.      setDef
192b0 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
192c0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
192d0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
192e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
192f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19300 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
19310 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
19320 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
19330 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
19340 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
19350 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
19360 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
19370 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
19380 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
19390 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
193a0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
193b0 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
193c0 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
193d0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
193e0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
193f0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
19400 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
19410 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
19420 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
19430 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
19440 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19450 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19460 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
19470 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
19480 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
19490 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
194a0 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
194b0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
194c0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
194d0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
194e0 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
194f0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
19500 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
19510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19520 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
19530 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
19540 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
19550 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
19560 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
19570 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
19580 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
19590 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
195a0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
195b0 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
195c0 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
195d0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
195e0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
195f0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
19600 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
19610 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
19620 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
19630 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19640 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19650 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19660 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19670 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
19680 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
19690 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
196a0 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
196b0 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
196c0 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
196d0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
196e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
196f0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
19700 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
19710 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
19720 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
19730 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
19740 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
19750 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19760 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19770 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
19780 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19790 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
197a0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
197b0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
197c0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
197d0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
197e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
197f0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
19800 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
19810 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
19820 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
19830 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
19840 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
19850 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19860 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19880 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
19890 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
198a0 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
198b0 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
198c0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
198d0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
198e0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
198f0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
19900 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
19910 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
19920 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
19930 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19940 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
19950 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
19960 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
19970 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
19980 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
19990 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
199a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
199b0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
199c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
199d0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
199e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
199f0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
19a00 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
19a10 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
19a20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
19a30 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
19a40 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
19a50 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
19a80 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
19a90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19aa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
19ab0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
19ac0 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
19ad0 61 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  a)==0 && nPage>n
19ae0 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
19af0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
19b00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19b10 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19b20 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19b30 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19b40 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
19b50 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
19b60 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
19b70 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
19b80 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
19b90 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
19ba0 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
19bb0 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
19bc0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
19bd0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
19be0 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
19bf0 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
19c00 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
19c10 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19c20 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19c30 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
19c40 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
19c50 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
19c60 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
19c70 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
19c80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19c90 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
19ca0 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
19cb0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
19cc0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
19cd0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
19ce0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
19cf0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
19d00 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
19d10 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
19d20 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
19d30 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
19d40 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
19d50 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
19d60 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
19d70 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
19d80 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
19d90 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
19da0 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
19db0 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
19dc0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
19dd0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
19de0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
19df0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
19e00 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
19e10 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
19e20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19e30 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
19e40 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
19e50 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
19e60 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
19e70 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
19e80 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
19e90 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
19ea0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
19eb0 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
19ec0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
19ed0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
19ee0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
19ef0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
19f00 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
19f10 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
19f20 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
19f30 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
19f40 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
19f50 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
19f60 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
19f70 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
19f80 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
19f90 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
19fa0 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
19fb0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
19fc0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
19fd0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
19fe0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
19ff0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
1a000 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
1a010 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
1a020 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1a030 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
1a040 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
1a050 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
1a060 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1a070 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
1a080 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1a090 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
1a0a0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
1a0b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1a0c0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
1a0d0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
1a0e0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
1a0f0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
1a100 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1a110 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1a120 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
1a130 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
1a140 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1a150 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1a160 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1a170 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1a180 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1a190 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1a1a0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1a1b0 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1a1c0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1a1d0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1a1e0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1a1f0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1a200 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1a210 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1a220 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1a230 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1a240 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1a250 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1a260 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1a270 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1a280 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1a290 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1a2a0 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1a2b0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1a2c0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1a2d0 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1a2e0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1a2f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1a300 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1a310 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1a320 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1a330 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1a340 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1a350 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1a360 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1a370 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1a380 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1a390 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1a3a0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1a3b0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1a3c0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1a3d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1a3e0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1a3f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1a400 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1a410 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1a420 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1a430 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1a440 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1a450 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a460 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1a470 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1a480 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1a490 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1a4a0 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1a4b0 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1a4c0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1a4d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1a4e0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1a4f0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1a500 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1a510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1a520 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1a530 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1a540 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1a550 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1a560 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1a570 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1a580 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a590 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1a5a0 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1a5b0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1a5c0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1a5d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a5e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1a5f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1a600 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1a610 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1a620 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1a630 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1a640 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1a650 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a660 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1a670 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1a680 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1a690 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1a6a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a6b0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1a6c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a6d0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1a6e0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1a6f0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1a700 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1a710 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
1a720 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
1a730 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
1a740 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
1a750 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
1a760 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
1a770 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
1a780 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
1a790 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
1a7a0 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
1a7b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1a7c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
1a7d0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
1a7e0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
1a7f0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
1a800 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
1a810 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1a820 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a830 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1a840 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
1a850 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
1a860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a870 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
1a880 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
1a890 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
1a8a0 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
1a8b0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
1a8c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1a8d0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
1a8e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a8f0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
1a900 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
1a910 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1a920 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
1a930 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a940 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
1a950 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
1a960 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
1a970 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1a980 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
1a990 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
1a9a0 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
1a9b0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
1a9c0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
1a9d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
1a9e0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
1a9f0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
1aa00 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
1aa10 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
1aa20 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
1aa30 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
1aa40 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
1aa50 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
1aa60 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
1aa70 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
1aa80 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
1aa90 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
1aaa0 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
1aab0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
1aac0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
1aad0 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
1aae0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
1aaf0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
1ab00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1ab10 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
1ab20 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1ab30 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
1ab40 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
1ab50 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
1ab60 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
1ab70 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
1ab80 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
1ab90 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
1aba0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1abb0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
1abc0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
1abd0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
1abe0 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
1abf0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
1ac00 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
1ac10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ac20 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1ac30 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1ac40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ac50 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
1ac60 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1ac70 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
1ac80 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
1ac90 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
1aca0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1acb0 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
1acc0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
1acd0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
1ace0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
1acf0 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
1ad00 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1ad10 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1ad20 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
1ad30 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
1ad40 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
1ad50 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
1ad60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ad70 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1ad80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
1ad90 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
1ada0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
1adb0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1adc0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
1add0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
1ade0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
1adf0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
1ae00 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
1ae10 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
1ae20 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1ae30 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
1ae40 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
1ae50 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1ae60 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
1ae70 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
1ae80 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
1ae90 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1aea0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
1aeb0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
1aec0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
1aed0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
1aee0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
1aef0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
1af00 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
1af10 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
1af20 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
1af30 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
1af40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1af50 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1af60 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
1af70 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
1af80 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
1af90 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1afa0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
1afb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
1afc0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
1afd0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
1afe0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1aff0 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
1b000 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b010 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
1b020 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1b030 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
1b040 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b050 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
1b060 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1b070 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
1b080 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1b090 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
1b0a0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1b0b0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
1b0c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b0d0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
1b0e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
1b0f0 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
1b100 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
1b110 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
1b120 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
1b130 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
1b140 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
1b150 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
1b160 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
1b170 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
1b180 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
1b190 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
1b1a0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
1b1b0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
1b1c0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
1b1d0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
1b1e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1b1f0 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
1b200 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
1b210 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1b220 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1b230 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
1b240 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
1b250 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
1b260 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
1b270 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
1b280 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
1b290 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
1b2a0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1b2b0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
1b2c0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
1b2d0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
1b2e0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
1b2f0 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
1b300 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
1b310 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
1b320 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
1b330 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
1b340 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
1b350 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
1b360 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
1b370 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
1b380 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
1b390 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1b3a0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
1b3b0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
1b3c0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
1b3d0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1b3e0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
1b3f0 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
1b400 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
1b410 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
1b420 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1b430 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
1b440 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
1b450 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b460 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1b470 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b480 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b490 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1b4a0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1b4b0 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
1b4c0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1b4d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1b4e0 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
1b4f0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
1b500 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1b510 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
1b520 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
1b530 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
1b540 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1b550 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1b560 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1b570 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
1b580 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
1b590 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
1b5a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1b5b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
1b5c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1b5d0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
1b5e0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
1b5f0 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
1b600 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
1b610 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1b620 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
1b630 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
1b640 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
1b650 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1b660 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1b670 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1b680 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1b690 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
1b6a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1b6b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1b6c0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1b6d0 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  CHE.  {.    sqli
1b6e0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
1b6f0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  .    /* If anoth
1b700 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1b710 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1b720 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1b730 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
1b740 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
1b750 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
1b760 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
1b770 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1b780 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  is.    ** reques
1b790 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
1b7a0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a  TE_LOCKED..    *
1b7b0 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61  /.    if( (wrfla
1b7c0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
1b7d0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1b7e0 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70  RITE).     || (p
1b7f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1b800 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
1b810 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f     ){.      pBlo
1b820 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
1b830 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65  r->db;.    }else
1b840 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1b850 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  .      BtLock *p
1b860 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Iter;.      for(
1b870 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1b880 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1b890 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1b8a0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1b8b0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
1b8c0 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
1b8d0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
1b8e0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  db;.          br
1b8f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1b900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b910 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
1b920 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
1b930 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
1b940 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
1b950 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b960 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1b970 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  HE;.      goto t
1b980 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20  rans_begun;.    
1b990 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1b9a0 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
1b9b0 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
1b9c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
1b9d0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
1b9e0 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
1b9f0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
1ba00 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
1ba10 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
1ba20 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
1ba30 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
1ba40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ba50 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
1ba60 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
1ba70 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1ba80 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
1ba90 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
1baa0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1bab0 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
1bac0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
1bad0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1bae0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1baf0 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
1bb00 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
1bb10 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
1bb20 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1bb30 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
1bb40 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
1bb50 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
1bb60 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
1bb70 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
1bb80 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
1bb90 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
1bba0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1bbb0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
1bbc0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
1bbd0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1bbe0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1bbf0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
1bc00 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
1bc10 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
1bc20 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
1bc30 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
1bc40 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1bc50 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
1bc60 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
1bc70 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
1bc80 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
1bc90 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
1bca0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
1bcb0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
1bcc0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
1bcd0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
1bce0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
1bcf0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1bd00 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
1bd10 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1bd20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1bd30 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      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 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1bd70 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1bd80 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1bd90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1bda0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1bdb0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
1bdc0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
1bdd0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1bde0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1bdf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1be00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1be10 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1be20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1be30 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1be40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1be50 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1be60 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1be70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1be80 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1be90 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1bea0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1beb0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1bec0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1bed0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1bee0 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
1bef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bf00 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1bf10 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1bf20 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1bf30 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1bf40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bf50 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1bf60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1bf70 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1bf80 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1bf90 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1bfa0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1bfb0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1bfc0 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1bfd0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1bfe0 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1bff0 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1c000 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1c010 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1c020 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1c030 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1c040 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1c050 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1c060 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1c070 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1c080 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1c090 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c0a0 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1c0b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1c0c0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1c0d0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1c0e0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1c0f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c100 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1c110 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1c120 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1c130 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1c140 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1c150 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1c160 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1c170 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1c180 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1c190 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1c1a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1c1b0 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1c1c0 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1c1d0 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1c1e0 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1c1f0 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1c200 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1c210 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1c220 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1c230 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1c240 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1c250 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1c260 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1c270 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1c280 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1c290 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1c2a0 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1c2b0 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1c2c0 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1c2d0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1c2e0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1c2f0 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1c300 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1c310 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1c320 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1c330 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1c340 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1c350 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1c360 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1c370 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1c380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1c3a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1c3b0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1c3c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1c3d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c3e0 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
1c3f0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
1c400 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1c410 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1c420 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1c430 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1c440 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1c450 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
1c460 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1c470 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1c480 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1c490 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1c4a0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
1c4b0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
1c4c0 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
1c4d0 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
1c4e0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1c4f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c500 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1c510 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1c520 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1c530 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1c540 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1c550 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c560 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1c570 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1c580 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1c590 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1c5a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1c5b0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1c5c0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1c5d0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1c5e0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1c5f0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1c600 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1c610 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1c620 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1c630 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1c640 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1c650 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1c660 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1c670 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1c680 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1c6b0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1c6c0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c6f0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1c700 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1c710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c730 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c740 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c750 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
1c760 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1c770 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1c780 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c790 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1c7a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1c7b0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1c7c0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1c7d0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1c7e0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1c7f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1c800 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  n rc;.  nCell = 
1c810 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1c820 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1c830 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1c840 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1c850 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1c860 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1c870 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1c880 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1c890 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c8a0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1c8b0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1c8c0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1c8d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1c8e0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1c8f0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1c900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1c910 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1c920 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1c930 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1c940 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c950 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c960 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1c970 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1c980 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1c990 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1c9a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c9b0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1c9c0 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1c9d0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1c9e0 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1c9f0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1ca00 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1ca10 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1ca20 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1ca30 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1ca40 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1ca50 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1ca60 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1ca70 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1ca80 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1ca90 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1caa0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1cab0 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1cac0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1cad0 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1cae0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1caf0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1cb00 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1cb10 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1cb20 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1cb40 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1cb50 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1cb60 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1cb70 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1cb80 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1cb90 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1cba0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1cbb0 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1cbc0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1cbd0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1cbe0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1cbf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1cc00 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1cc10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1cc20 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1cc30 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1cc40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1cc50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1cc60 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1cc70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1cc80 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1cc90 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1cca0 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1ccb0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1ccc0 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1ccd0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1cce0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1ccf0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1cd00 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1cd10 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1cd20 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1cd30 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1cd40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1cd50 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
1cd60 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1cd70 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
1cd80 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
1cd90 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
1cda0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1cdb0 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20   nCell;.    int 
1cdc0 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50  rc;..    rc = pP
1cdd0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51  age->isInit ? SQ
1cde0 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49  LITE_OK : btreeI
1cdf0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1ce00 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1ce10 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c  urn rc;.    nCel
1ce20 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1ce30 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
1ce40 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1ce50 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
1ce60 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1ce70 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
1ce80 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1ce90 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
1cea0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1ceb0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
1cec0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
1ced0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1cee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
1cef0 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
1cf00 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
1cf10 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e      if( pCell+in
1cf20 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65  fo.nSize > pPage
1cf30 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70  ->aData+pPage->p
1cf40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
1cf50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1cf60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1cf70 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
1cf80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
1cf90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1cfa0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
1cfb0 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1cfc0 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e-4) ){.        
1cfd0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1cfe0 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c  ll+info.nSize-4,
1cff0 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1d000 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1d020 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d030 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1d040 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1d050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1d060 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1d070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1d080 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1d090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1d0a0 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1d0b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1d0c0 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1d0d0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1d0e0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1d0f0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1d100 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1d110 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1d120 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1d130 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
1d140 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
1d150 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1d160 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1d170 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1d180 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iTo);.    }.  }.
1d190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d1a0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
1d1b0 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
1d1c0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1d1d0 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
1d1e0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
1d1f0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1d200 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
1d210 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
1d220 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
1d230 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
1d240 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
1d250 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
1d260 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
1d270 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
1d280 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
1d290 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
1d2a0 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
1d2b0 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
1d2c0 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
1d2d0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1d2e0 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
1d2f0 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
1d300 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1d310 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1d320 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1d330 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1d340 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1d350 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1d360 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1d370 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1d380 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1d390 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d3a0 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1d3b0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1d3c0 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1d3d0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1d3e0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1d3f0 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1d400 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1d410 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1d420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1d430 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1d440 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1d450 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1d460 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1d470 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1d480 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1d490 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1d4a0 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1d4b0 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1d4c0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1d4d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1d4e0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1d4f0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1d500 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1d510 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1d520 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1d530 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1d540 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1d550 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1d560 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1d570 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1d580 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1d590 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1d5a0 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1d5b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d5c0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1d5d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1d5e0 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1d5f0 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
1d600 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
1d610 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
1d620 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
1d630 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
1d640 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
1d650 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
1d660 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
1d670 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
1d680 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
1d690 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
1d6a0 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
1d6b0 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
1d6c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1d6d0 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
1d6e0 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
1d6f0 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
1d700 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1d710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d720 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d730 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
1d740 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
1d750 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
1d760 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
1d770 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
1d780 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
1d790 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
1d7a0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1d7b0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
1d7c0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1d7d0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
1d7e0 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
1d7f0 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
1d800 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1d810 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
1d820 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
1d830 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1d840 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
1d850 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
1d860 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1d870 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
1d880 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1d890 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
1d8a0 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
1d8b0 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
1d8c0 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
1d8d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
1d8e0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1d8f0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1d900 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1d910 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1d920 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
1d930 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
1d940 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d950 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d960 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1d980 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
1d990 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
1d9a0 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
1d9b0 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
1d9c0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1d9d0 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
1d9e0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
1d9f0 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
1da00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1da10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1da20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1da30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1da40 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
1da50 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
1da60 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
1da70 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
1da80 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
1da90 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
1daa0 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
1dab0 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
1dac0 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
1dad0 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
1dae0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
1daf0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1db00 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1db10 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
1db20 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
1db30 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1db40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1db50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1db60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1db70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1db80 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
1db90 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1dba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1dbb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1dbc0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1dbd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1dbe0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
1dbf0 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
1dc00 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
1dc10 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1dc20 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
1dc30 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1dc40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1dc50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
1dc60 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
1dc70 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
1dc80 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
1dc90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1dca0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1dcb0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1dcc0 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
1dcd0 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
1dce0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1dcf0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
1dd00 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
1dd10 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
1dd20 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
1dd30 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
1dd40 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
1dd50 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
1dd60 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1dd70 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
1dd80 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1dd90 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
1dda0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
1ddb0 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
1ddc0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1ddd0 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
1dde0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
1ddf0 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
1de00 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
1de10 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
1de20 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
1de30 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
1de40 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1de50 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
1de60 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
1de70 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
1de80 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
1de90 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
1dea0 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
1deb0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
1dec0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1ded0 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
1dee0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1def0 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
1df00 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
1df10 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
1df20 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
1df30 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1df40 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
1df50 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
1df60 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
1df70 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
1df80 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1df90 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
1dfa0 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
1dfb0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1dfc0 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
1dfd0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
1dfe0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
1dff0 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
1e000 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
1e010 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
1e020 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
1e030 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
1e040 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1e050 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
1e060 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
1e070 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
1e080 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
1e090 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
1e0a0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
1e0b0 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
1e0c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e0d0 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
1e0e0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
1e0f0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
1e100 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e110 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1e120 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1e130 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
1e140 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
1e150 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1e160 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
1e170 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
1e180 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1e190 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1e1a0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
1e1b0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
1e1c0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1e1d0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1e1e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
1e1f0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
1e200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1e210 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
1e220 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1e230 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
1e240 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
1e250 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e270 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e280 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1e290 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1e2a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e2b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e2c0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1e2d0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1e2e0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1e2f0 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1e300 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1e310 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
1e320 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
1e330 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
1e340 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
1e350 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
1e360 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
1e370 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
1e380 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
1e390 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1e3a0 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
1e3b0 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
1e3c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
1e3d0 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
1e3e0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
1e3f0 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
1e400 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
1e410 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
1e420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e430 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
1e440 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1e450 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1e460 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1e470 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1e480 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1e490 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
1e4a0 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
1e4b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e4c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e4d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e4e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1e4f0 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
1e500 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
1e510 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1e520 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
1e530 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1e540 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
1e550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e560 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
1e570 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
1e580 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
1e590 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
1e5a0 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
1e5b0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
1e5c0 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
1e5d0 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1e5e0 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
1e5f0 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
1e600 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1e610 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
1e620 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1e630 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
1e640 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1e650 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
1e660 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
1e670 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e690 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e6a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1e6b0 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
1e6c0 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
1e6d0 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
1e6e0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
1e6f0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
1e700 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
1e710 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
1e720 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
1e730 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
1e740 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
1e750 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
1e760 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
1e770 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
1e780 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
1e790 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
1e7a0 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
1e7b0 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
1e7c0 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
1e7d0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1e7e0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
1e7f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1e800 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1e810 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
1e820 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
1e830 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
1e840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e850 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
1e860 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1e870 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1e880 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1e890 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1e8a0 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
1e8b0 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
1e8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e8d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1e8e0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1e8f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1e900 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1e910 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
1e920 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1e930 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
1e940 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
1e950 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
1e960 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
1e970 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1e980 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
1e990 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
1e9a0 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
1e9b0 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
1e9c0 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
1e9d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1e9e0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
1e9f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ea00 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1ea10 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1ea20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
1ea30 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1ea40 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
1ea50 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
1ea60 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
1ea70 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1ea80 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
1ea90 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1eaa0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
1eab0 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1eac0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
1ead0 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
1eae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1eaf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
1eb00 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1eb10 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1eb20 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
1eb30 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
1eb40 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
1eb50 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
1eb60 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
1eb70 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
1eb80 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
1eb90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1eba0 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
1ebb0 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
1ebc0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
1ebd0 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
1ebe0 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
1ebf0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
1ec00 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
1ec10 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1ec40 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
1ec50 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
1ec60 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ec80 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
1ec90 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
1eca0 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
1ecb0 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
1ecc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1ecd0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
1ece0 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
1ecf0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
1ed00 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
1ed10 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
1ed20 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
1ed30 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
1ed40 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
1ed50 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
1ed60 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
1ed70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ed80 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
1ed90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1eda0 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1edb0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
1edc0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1edd0 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
1ede0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1edf0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1ee00 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
1ee10 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
1ee20 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1ee30 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
1ee40 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
1ee50 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1ee60 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
1ee70 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
1ee80 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
1ee90 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1eea0 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
1eeb0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1eec0 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
1eed0 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
1eee0 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
1eef0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
1ef00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1ef10 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
1ef20 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
1ef30 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
1ef40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1ef50 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
1ef60 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1ef70 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
1ef80 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
1ef90 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
1efa0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1efb0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1efc0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
1efd0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1efe0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1eff0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1f000 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
1f010 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1f020 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
1f030 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1f040 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1f050 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1f060 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
1f070 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1f080 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
1f090 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1f0a0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f0b0 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
1f0c0 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1f0d0 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1f0e0 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
1f0f0 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
1f100 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f110 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f120 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
1f130 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1f140 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1f150 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1f160 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f180 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1f190 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1f1a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
1f1b0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1f1c0 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
1f1d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f1e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f1f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1f200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f210 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1f220 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f230 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1f240 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f250 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1f260 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f270 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f280 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1f290 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1f2a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f2b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f2c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f2d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
1f2e0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
1f2f0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
1f300 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1f310 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
1f320 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1f330 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
1f340 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1f350 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
1f360 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
1f370 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1f380 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
1f390 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1f3a0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1f3b0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
1f3c0 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
1f3d0 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
1f3e0 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
1f3f0 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
1f400 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
1f410 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
1f420 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
1f430 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
1f440 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
1f450 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
1f460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f470 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f480 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1f490 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1f4a0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
1f4b0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1f4c0 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74  er); )..  assert
1f4d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1f4e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1f4f0 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
1f500 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1f510 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
1f520 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1f530 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
1f540 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
1f550 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1f560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f570 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1f580 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
1f590 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
1f5a0 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
1f5b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1f5c0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1f5d0 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
1f5e0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
1f5f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1f600 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
1f610 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
1f620 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
1f630 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
1f640 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
1f650 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
1f660 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1f670 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
1f680 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
1f690 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
1f6a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f6b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
1f6c0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1f6d0 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
1f6e0 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
1f6f0 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
1f700 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
1f710 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
1f720 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
1f730 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
1f740 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
1f750 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
1f760 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
1f770 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
1f780 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
1f790 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f7a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1f7b0 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
1f7c0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f7d0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1f7e0 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
1f7f0 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1f800 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
1f810 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
1f820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f830 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
1f840 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
1f850 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1f860 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1f870 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1f880 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
1f890 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
1f8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1f8b0 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
1f8c0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1f8d0 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
1f8e0 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
1f8f0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1f900 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
1f910 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
1f920 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1f930 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f940 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1f950 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f960 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f970 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1f980 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
1f990 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f9a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1f9b0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1f9c0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1f9d0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
1f9e0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
1f9f0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1fa00 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1fa10 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
1fa20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fa30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1fa40 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1fa50 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1fa60 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1fa70 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
1fa80 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1fa90 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
1faa0 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
1fab0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fac0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
1fad0 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
1fae0 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
1faf0 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
1fb00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fb10 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1fb20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
1fb30 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1fb40 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
1fb50 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
1fb60 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
1fb70 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
1fb80 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1fb90 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
1fba0 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
1fbb0 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
1fbc0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1fbd0 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
1fbe0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1fbf0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1fc00 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
1fc10 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
1fc20 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
1fc30 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
1fc40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
1fc50 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
1fc60 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
1fc70 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
1fc80 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
1fc90 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
1fca0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
1fcb0 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
1fcc0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1fcd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1fce0 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
1fcf0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
1fd00 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
1fd10 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1fd20 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
1fd30 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
1fd40 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
1fd50 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
1fd60 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
1fd70 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
1fd80 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
1fd90 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
1fda0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1fdb0 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
1fdc0 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
1fdd0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
1fde0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
1fdf0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
1fe00 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1fe10 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
1fe20 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
1fe30 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1fe40 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1fe50 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
1fe60 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
1fe70 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1fe80 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1fe90 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1fea0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1feb0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1fec0 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1fed0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1fee0 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1fef0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1ff00 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1ff10 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1ff20 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1ff30 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1ff40 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1ff50 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1ff60 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1ff70 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1ff80 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1ff90 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1ffa0 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1ffb0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1ffc0 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1ffd0 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1ffe0 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1fff0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
20000 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
20010 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
20020 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
20030 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
20040 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
20050 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20060 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
20070 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
20080 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
20090 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
200a0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
200b0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
200c0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
200d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
200e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
200f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
20100 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20110 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
20120 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
20130 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
20140 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
20150 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
20160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20170 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20180 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20190 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
201a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
201b0 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
201c0 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
201d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
201e0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
201f0 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
20200 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
20210 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
20220 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20230 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
20240 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
20250 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
20260 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
20270 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20280 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
20290 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
202a0 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
202b0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
202c0 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
202d0 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
202e0 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
202f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
20300 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
20310 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
20320 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
20330 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20340 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
20350 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
20360 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
20370 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
20380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20390 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
203a0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
203b0 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
203c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
203d0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
203e0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
203f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
20400 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
20410 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
20420 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
20430 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
20440 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
20450 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
20460 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
20470 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
20480 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
20490 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
204a0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
204b0 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
204c0 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
204d0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
204e0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
204f0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
20500 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
20510 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
20520 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
20530 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
20540 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
20550 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
20560 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
20570 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
20580 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
20590 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
205a0 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
205b0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
205c0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
205d0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
205e0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
205f0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
20600 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
20610 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
20620 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
20630 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
20640 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
20650 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
20660 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
20670 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
20680 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
20690 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
206a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
206b0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
206c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
206d0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
206e0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
206f0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
20700 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
20710 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
20720 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
20730 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
20740 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
20750 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
20760 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
20770 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
20780 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
20790 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
207a0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
207b0 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
207c0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
207d0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
207e0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
207f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20800 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
20810 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
20820 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
20830 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
20840 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20850 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
20860 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
20870 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
20880 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
20890 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
208a0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
208b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
208c0 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
208d0 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
208e0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
208f0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
20900 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
20910 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
20920 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
20930 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
20940 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
20950 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
20960 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
20970 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
20980 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
20990 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
209a0 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
209b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
209c0 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
209d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
209e0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
209f0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
20a00 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
20a10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
20a20 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
20a30 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
20a40 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
20a50 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
20a60 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
20a70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20a80 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
20a90 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
20aa0 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
20ab0 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
20ac0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
20ad0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
20ae0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
20af0 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
20b00 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
20b10 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
20b20 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
20b30 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
20b40 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
20b50 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
20b60 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
20b70 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
20b80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20b90 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
20ba0 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
20bb0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
20bc0 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
20bd0 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
20be0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
20bf0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
20c00 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
20c10 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
20c20 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
20c30 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
20c40 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
20c50 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
20c60 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
20c70 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
20c80 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
20c90 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
20ca0 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
20cb0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
20cc0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
20cd0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
20ce0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20cf0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
20d00 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
20d10 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
20d20 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
20d30 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
20d40 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20d50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
20d60 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
20d70 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
20d80 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
20d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20da0 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
20db0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
20dc0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
20dd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
20de0 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
20df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
20e00 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
20e10 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
20e20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
20e30 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
20e40 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
20e50 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
20e60 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20e70 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
20e80 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
20e90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20ea0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
20eb0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
20ec0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
20ed0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
20ee0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
20ef0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
20f00 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20f10 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
20f20 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
20f30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
20f40 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
20f50 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
20f60 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
20f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20f80 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65  }.    p->iDataVe
20f90 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d  rsion--;  /* Com
20fa0 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67  pensate for pPag
20fb0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
20fc0 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  ++; */.    pBt->
20fd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
20fe0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
20ff0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
21000 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
21010 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
21020 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
21030 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21040 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21050 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
21060 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
21070 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
21080 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
21090 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
210a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
210b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
210c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
210d0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
210e0 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
210f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21100 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
21110 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
21120 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
21130 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
21140 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
21150 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
21160 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
21170 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
21180 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
21190 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
211a0 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
211b0 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
211c0 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61  any BtShared tha
211d0 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
211e0 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74  rences.  Or if t
211f0 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
21200 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74  g is set to 1, t
21210 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70  hen only.** trip
21220 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
21230 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75  nd leave read cu
21240 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e  rsors unchanged.
21250 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
21260 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  sor is a candida
21270 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64  te to be tripped
21280 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
21290 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f  ors.** that belo
212a0 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ng to other data
212b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
212c0 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
212d0 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68  be.** sharing th
212e0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
212f0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
21300 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
21310 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
21320 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ack occurs. If t
21330 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20  he writeOnly.** 
21340 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
21350 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75  en only write-cu
21360 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72  rsors need be tr
21370 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c  ipped - read-onl
21380 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76  y.** cursors sav
21390 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20  e their current 
213a0 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61  positions so tha
213b0 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69  t they may conti
213c0 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  nue .** followin
213d0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  g the rollback. 
213e0 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  Or, if writeOnly
213f0 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63   is false, all c
21400 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74  ursors are .** t
21410 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72  ripped. In gener
21420 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73  al, writeOnly is
21430 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72   false if the tr
21440 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a  ansaction being.
21450 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d  ** rolled back m
21460 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
21470 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20  base schema. In 
21480 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65  this case b-tree
21490 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d   root.** pages m
214a0 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64  ay be moved or d
214b0 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
214c0 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74  database altoget
214d0 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69  her, making.** i
214e0 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61  t unsafe for rea
214f0 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e  d cursors to con
21500 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tinue..**.** If 
21510 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
21520 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  ag is true and a
21530 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
21540 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a  ntered while .**
21550 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72   saving the curr
21560 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
21570 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
21580 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c  or, all cursors,
21590 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61   .** including a
215a0 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20  ll read-cursors 
215b0 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a  are tripped..**.
215c0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
215d0 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
215e0 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e  essful, or if an
215f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
21600 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20  ile.** saving a 
21610 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c  cursor position,
21620 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
21630 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
21640 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
21650 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
21660 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
21670 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
21680 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
21690 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  *p;.  int rc = S
216a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
216b0 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d  ert( (writeOnly=
216c0 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =0 || writeOnly=
216d0 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74  =1) && BTCF_Writ
216e0 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  eFlag==1 );.  if
216f0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
21700 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21710 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66  r(pBtree);.    f
21720 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
21730 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
21740 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
21750 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
21760 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
21770 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
21780 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
21790 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
217a0 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
217b0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
217c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
217d0 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
217e0 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
217f0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
21800 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
21810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21820 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
21830 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
21840 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
21850 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
21860 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21880 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
21890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
218a0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
218b0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
218c0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
218d0 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
218e0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
218f0 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
21900 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
21910 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
21920 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
21930 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
21940 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
21950 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
21960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
21970 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21980 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
21990 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
219a0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
219b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
219c0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
219d0 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
219e0 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  ot SQLITE_OK the
219f0 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  n cursors will b
21a00 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74  e invalidated (t
21a10 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79  ripped)..** Only
21a20 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
21a30 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72  re tripped if wr
21a40 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20  iteOnly is true 
21a50 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  but all cursors 
21a60 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69  are.** tripped i
21a70 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
21a80 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d  alse.  Any attem
21a90 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74  pt to use.** a t
21aa0 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69  ripped cursor wi
21ab0 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
21ac0 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
21ad0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
21ae0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
21af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21b00 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
21b10 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
21b20 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
21b30 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
21b40 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
21b50 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
21b60 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
21b70 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20  t tripCode, int 
21b80 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e  writeOnly){.  in
21b90 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
21ba0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21bb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21bc0 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72  1;..  assert( wr
21bd0 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72  iteOnly==1 || wr
21be0 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  iteOnly==0 );.  
21bf0 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65  assert( tripCode
21c00 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  ==SQLITE_ABORT_R
21c10 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43  OLLBACK || tripC
21c20 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
21c30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21c40 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
21c50 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
21c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
21c70 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
21c80 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
21c90 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
21ca0 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30   ) writeOnly = 0
21cb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
21cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21cd0 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
21ce0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  e ){.    int rc2
21cf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54   = sqlite3BtreeT
21d00 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
21d10 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65   tripCode, write
21d20 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72  Only);.    asser
21d30 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
21d40 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d   || (writeOnly==
21d50 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45  0 && rc2==SQLITE
21d60 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _OK) );.    if( 
21d70 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
21d80 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20   rc = rc2;.  }. 
21d90 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
21da0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
21db0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
21dc0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
21dd0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
21de0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
21df0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21e00 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
21e10 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
21e20 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
21e30 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
21e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21e50 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
21e60 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
21e70 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
21e80 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
21e90 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
21ea0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
21eb0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
21ec0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
21ed0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
21ee0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
21ef0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
21f00 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
21f10 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
21f20 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
21f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21f40 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
21f50 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
21f60 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
21f70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21f80 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
21f90 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
21fa0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
21fb0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
21fc0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
21fd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
21fe0 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
21ff0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
22000 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
22010 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22020 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
22030 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
22040 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
22050 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
22060 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
22070 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
22080 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
22090 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
220a0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
220b0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
220c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
220d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
220e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
220f0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
22100 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
22110 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
22120 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
22130 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
22140 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
22150 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
22160 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
22170 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
22180 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
22190 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
221a0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
221b0 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
221c0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
221d0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
221e0 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
221f0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
22200 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
22210 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
22220 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
22230 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
22240 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
22250 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
22260 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
22270 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
22280 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
22290 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
222a0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
222b0 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
222c0 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
222d0 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
222e0 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
222f0 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
22300 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
22310 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
22320 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
22330 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
22340 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
22350 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
22360 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
22370 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
22380 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
22390 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
223a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
223b0 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
223c0 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
223d0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
223e0 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
223f0 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
22400 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
22410 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
22420 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
22430 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
22440 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
22450 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
22460 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
22470 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
22480 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
22490 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
224a0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
224b0 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
224c0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
224d0 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
224e0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
224f0 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
22500 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
22510 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
22520 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
22530 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
22540 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
22550 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
22560 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
22570 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
22580 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
22590 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
225a0 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
225b0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
225c0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
225d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
225e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
225f0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
22600 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
22610 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
22620 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
22630 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
22640 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
22650 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
22660 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
22670 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
22680 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
22690 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
226a0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
226b0 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
226c0 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
226d0 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
226e0 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
226f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
22700 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
22710 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
22720 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
22730 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
22740 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
22750 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
22760 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
22770 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22780 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
22790 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
227a0 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
227b0 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
227c0 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
227d0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
227e0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
227f0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
22800 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
22810 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
22820 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
22830 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
22840 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
22850 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
22860 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
22870 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
22880 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
22890 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
228a0 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
228b0 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
228c0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
228d0 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
228e0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
228f0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
22900 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
22910 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
22920 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
22930 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
22940 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
22950 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
22960 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
22970 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
22980 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
22990 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
229a0 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
229b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
229c0 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
229d0 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
229e0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
229f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22a00 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
22a10 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22a20 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
22a30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22a40 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
22a50 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
22a60 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
22a70 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
22a80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
22a90 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
22aa0 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
22ab0 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
22ac0 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
22ad0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22ae0 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ter(p);.    if( 
22af0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
22b00 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
22b10 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
22b20 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
22b30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
22b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22b60 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
22b70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
22b80 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
22b90 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
22ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22bb0 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
22bc0 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
22bd0 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
22be0 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
22bf0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
22c00 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
22c10 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
22c20 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
22c30 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
22c40 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
22c50 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
22c60 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
22c70 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
22c80 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
22c90 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
22ca0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
22cb0 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
22cc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
22cd0 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
22ce0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
22cf0 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
22d00 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
22d10 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
22d20 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
22d30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22d40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
22d50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22d60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
22d70 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
22d80 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
22d90 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
22da0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
22db0 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
22dc0 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
22dd0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
22de0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
22df0 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
22e00 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
22e10 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
22e20 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
22e30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
22e40 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
22e50 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
22e60 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
22e70 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
22e80 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
22e90 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
22ea0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
22eb0 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
22ec0 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
22ed0 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
22ee0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
22ef0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
22f00 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
22f10 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
22f20 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
22f30 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
22f40 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
22f50 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
22f60 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
22f70 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
22f80 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
22f90 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
22fa0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
22fb0 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
22fc0 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
22fd0 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
22fe0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
22ff0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
23000 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
23010 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
23020 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
23030 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
23040 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
23050 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
23060 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
23070 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
23080 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
23090 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
230a0 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
230b0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
230c0 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
230d0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
230e0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
230f0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
23100 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
23110 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
23120 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
23130 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
23140 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
23150 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
23160 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
23170 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
23180 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
23190 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
231a0 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
231b0 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
231c0 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
231d0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
231e0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
231f0 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
23200 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
23210 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
23220 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
23230 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
23240 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
23250 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
23260 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
23270 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
23280 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
23290 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
232a0 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
232b0 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
232c0 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
232d0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
232e0 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
232f0 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
23300 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
23310 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
23320 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
23330 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
23340 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
23350 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
23360 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
23370 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
23380 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
23390 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
233a0 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
233b0 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
233c0 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
233d0 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
233e0 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
233f0 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
23400 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
23410 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
23420 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
23430 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
23440 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
23450 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
23460 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
23470 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
23480 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
23490 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
234a0 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
234b0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
234c0 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
234d0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
234e0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
234f0 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
23500 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
23510 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
23520 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
23530 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23540 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
23550 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
23560 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
23570 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
23580 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
23590 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
235a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
235b0 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
235c0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
235f0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
23600 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23630 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
23640 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
23670 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
23680 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
23690 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
236a0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
236b0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
236c0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
236d0 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
236e0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
23710 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
23720 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23730 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
23740 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
23750 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
23760 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
23770 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
23780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23790 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
237a0 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
237b0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
237c0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
237d0 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
237e0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
237f0 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
23800 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
23810 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
23820 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
23830 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
23840 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
23850 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
23860 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
23870 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
23880 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
23890 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
238a0 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
238b0 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
238c0 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
238d0 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
238e0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
238f0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
23900 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
23910 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
23920 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
23930 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23940 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
23950 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
23960 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
23970 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
23980 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
23990 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
239a0 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
239b0 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
239c0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
239d0 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
239e0 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
239f0 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
23a00 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
23a10 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
23a20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
23a30 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
23a40 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
23a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
23a60 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
23a70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
23a80 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
23a90 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
23aa0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
23ab0 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
23ac0 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
23ad0 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
23ae0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
23af0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
23b00 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
23b10 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
23b20 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
23b30 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
23b40 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
23b50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
23b60 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
23b70 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
23b80 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
23b90 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
23ba0 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
23bb0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
23bc0 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
23bd0 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
23be0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
23bf0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
23c00 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
23c10 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
23c20 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
23c30 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
23c40 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
23c50 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
23c60 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
23c70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
23c80 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
23c90 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
23ca0 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
23cb0 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
23cc0 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
23cd0 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
23ce0 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
23cf0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
23d00 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
23d10 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
23d20 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
23d30 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
23d40 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
23d50 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
23d60 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
23d70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
23d80 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
23d90 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
23da0 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
23db0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
23dc0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
23dd0 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
23de0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
23df0 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
23e00 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
23e10 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
23e20 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
23e30 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
23e40 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
23e50 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
23e60 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
23e70 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
23e80 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23e90 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ec0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
23ed0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f00 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
23f10 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
23f20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23f50 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
23f60 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
23f70 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
23f80 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
23f90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23fa0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
23fb0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
23fc0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fe0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
23ff0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
24000 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
24010 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
24020 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24030 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24040 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
24050 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
24060 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
24070 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
24080 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
24090 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
240a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
240b0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
240c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
240d0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
240e0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
240f0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
24100 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
24110 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
24120 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
24130 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
24140 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
24150 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
24160 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
24170 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
24180 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
24190 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
241a0 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
241b0 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
241c0 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
241d0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
241e0 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
241f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
24200 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
24210 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
24220 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
24230 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
24240 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
24250 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
24260 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
24270 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
24280 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
24290 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
242a0 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
242b0 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
242c0 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
242d0 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
242e0 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
242f0 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
24300 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
24310 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
24320 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
24330 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
24340 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
24350 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
24360 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
24370 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
24380 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
24390 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
243a0 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
243b0 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
243c0 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
243d0 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
243e0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
243f0 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
24400 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
24410 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
24420 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
24430 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
24440 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
24450 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
24460 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
24470 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
24480 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
24490 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
244a0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
244b0 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
244c0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
244d0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
244e0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
244f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
24500 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
24510 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Cur);.    assert
24520 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
24530 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
24540 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
24550 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
24560 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
24570 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
24580 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
24590 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
245a0 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
245b0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
245c0 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
245d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
245e0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
245f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
24600 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
24610 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
24620 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
24630 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
24640 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
24650 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
24660 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
24670 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
24680 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
24690 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
246a0 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
246b0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
246c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
246d0 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
246e0 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
246f0 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
24700 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
24710 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
24720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24730 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24740 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
24750 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
24760 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
24770 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
24780 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
24790 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
247a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
247b0 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
247c0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
247d0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
247e0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
247f0 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
24800 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
24810 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
24820 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
24830 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
24840 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
24850 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
24860 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
24870 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
24880 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
24890 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
248a0 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
248b0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
248c0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
248d0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
248e0 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
248f0 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
24900 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
24910 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
24920 67 65 5d 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26  ge], pCur->ix, &
24930 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
24940 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
24950 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
24960 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
24970 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
24980 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
24990 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
249a0 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
249b0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
249c0 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
249d0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
249e0 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
249f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
24a00 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
24a10 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
24a20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
24a30 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
24a40 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
24a50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
24a60 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
24a70 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66  r->ix,&pCur->inf
24a80 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
24a90 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
24aa0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
24ab0 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
24ac0 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
24ad0 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
24ae0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
24af0 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
24b00 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
24b10 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
24b20 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
24b30 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
24b40 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
24b50 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
24b60 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
24b70 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
24b80 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
24b90 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
24ba0 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
24bb0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
24bc0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
24bd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24be0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
24bf0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24c00 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
24c10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24c20 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
24c30 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
24c40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24c50 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e  eeCursorIsValidN
24c60 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  N(BtCursor *pCur
24c70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
24c80 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
24c90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24ca0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a  URSOR_VALID;.}..
24cb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24cc0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
24cd0 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f  teger key or "ro
24ce0 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65  wid" for a table
24cf0 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20   btree..** This 
24d00 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
24d10 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73  valid for a curs
24d20 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
24d30 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72  ing into a.** or
24d40 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72  dinary table btr
24d50 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ee.  If the curs
24d60 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  or points to an 
24d70 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a  index btree or.*
24d80 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68  * is invalid, th
24d90 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73  e result of this
24da0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65   routine is unde
24db0 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71  fined..*/.i64 sq
24dc0 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
24dd0 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  rKey(BtCursor *p
24de0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
24df0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24e00 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24e10 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24e20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24e40 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
24e50 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
24e60 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
24e70 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a  r->info.nKey;.}.
24e80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24e90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
24ea0 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72  s of payload for
24eb0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
24ec0 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65  pCur is.** curre
24ed0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
24ee0 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72  .  For table btr
24ef0 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
24f00 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  e the amount.** 
24f10 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e  of data.  For in
24f20 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69 73  dex btrees, this
24f30 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a   will be the siz
24f40 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  e of the key..**
24f50 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
24f60 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
24f70 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
24f80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
24f90 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
24fa0 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
24fb0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
24fc0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
24fd0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
24fe0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
24ff0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
25000 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25010 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
25020 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
25030 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25040 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
25050 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25060 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25070 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25080 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
25090 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
250a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
250b0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
250c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
250d0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
250e0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
250f0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
25100 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
25110 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
25120 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
25130 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25140 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
25150 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
25160 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
25170 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
25180 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
25190 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
251a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
251b0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
251c0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
251d0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
251e0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
251f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
25200 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
25210 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25220 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
25230 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
25240 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
25250 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
25260 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
25270 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
25280 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
25290 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
252a0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
252b0 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
252c0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
252d0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
252e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
252f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
25300 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
25310 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
25320 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
25330 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
25340 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
25350 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
25360 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
25370 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
25380 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
25390 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
253a0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
253b0 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
253c0 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
253d0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
253e0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
253f0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
25400 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
25410 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
25420 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
25430 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
25440 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
25450 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
25460 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
25470 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
25480 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
25490 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
254a0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
254b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
254c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
254d0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
254e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
254f0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
25500 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
25510 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
25520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25530 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
25540 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
25550 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
25560 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
25570 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
25580 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
25590 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
255a0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
255b0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
255c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
255d0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
255e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
255f0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
25600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
25610 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
25620 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25630 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
25640 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
25650 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
25660 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
25670 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
25680 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
25690 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
256a0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
256b0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
256c0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
256d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
256e0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
256f0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
25700 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
25710 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
25720 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
25730 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
25740 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
25750 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
25760 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
25770 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
25780 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
25790 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
257a0 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
257b0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
257c0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
257d0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
257e0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
257f0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
25800 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
25810 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
25820 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
25830 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
25840 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
25850 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
25860 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
25870 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
25880 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25890 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
258a0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
258b0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
258c0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
258d0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
258e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
258f0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
25900 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
25910 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
25920 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
25930 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
25940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25950 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
25960 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
25970 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
25980 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
25990 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
259a0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
259b0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
259c0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
259d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
259e0 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
259f0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
25a00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
25a10 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
25a20 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
25a30 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
25a40 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
25a50 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
25a60 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
25a70 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
25a80 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
25a90 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
25aa0 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
25ab0 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
25ac0 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
25ad0 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
25ae0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
25af0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
25b00 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
25b10 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
25b20 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
25b30 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
25b40 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
25b50 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
25b60 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
25b70 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
25b80 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
25b90 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
25ba0 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
25bb0 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
25bc0 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
25bd0 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
25be0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
25bf0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
25c00 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
25c10 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
25c20 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
25c30 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
25c40 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
25c50 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
25c60 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
25c70 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
25c80 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
25c90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
25ca0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
25cb0 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
25cc0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
25cd0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
25ce0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
25cf0 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
25d00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25d10 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
25d20 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d40 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
25d50 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
25d60 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
25d70 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
25d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
25d90 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
25da0 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
25db0 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
25dc0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
25dd0 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
25de0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
25df0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
25e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25e10 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
25e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
25e40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
25e50 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
25e60 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
25e70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25e80 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
25e90 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
25ea0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
25eb0 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
25ec0 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
25ed0 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
25ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
25f00 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
25f10 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
25f20 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
25f30 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
25f40 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
25f50 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
25f60 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
25f70 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
25f80 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
25f90 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
25fa0 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
25fb0 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
25fc0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
25fd0 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
25fe0 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
25ff0 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
26000 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
26010 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a  rflow cache..**.
26020 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
26030 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
26040 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
26050 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
26060 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
26070 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
26080 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
26090 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
260a0 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
260b0 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
260c0 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
260d0 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
260e0 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
260f0 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
26100 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
26110 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  If the current c
26120 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
26130 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
26140 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74  rflow pages.** t
26150 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
26160 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
26170 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
26180 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f  opulate.** the o
26190 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
261a0 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
261b0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
261c0 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
261d0 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
261e0 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
261f0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
26200 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
26210 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
26220 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
26230 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
26240 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
26250 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
26260 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
26270 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
26280 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
26290 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
262a0 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
262b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
262c0 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
262d0 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
262e0 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
262f0 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
26300 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
26310 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
26320 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
26330 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
26340 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
26350 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
26360 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
26370 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
26380 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
26390 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
263a0 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
263b0 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
263c0 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
263d0 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
263e0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
263f0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
26400 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
26410 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
26420 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
26430 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
26440 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
26450 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
26460 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
26470 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
26480 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
26490 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
264a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
264b0 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
264c0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
264d0 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
264e0 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
264f0 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
26500 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
26510 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
26520 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
26530 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
26540 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26550 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
26560 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
26570 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
26580 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
26590 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
265a0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
265b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
265c0 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265e0 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
265f0 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
26600 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
26610 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
26620 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  AD.  unsigned ch
26630 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53  ar * const pBufS
26640 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20  tart = pBuf;    
26650 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69   /* Start of ori
26660 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72  ginal out buffer
26670 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
26680 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
26690 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20   assert( eOp==0 
266a0 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61  || eOp==1 );.  a
266b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
266c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
266d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
266e0 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e  Cur->ix<pPage->n
266f0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
26700 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
26710 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
26720 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
26730 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
26740 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
26750 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66  ad;.  assert( of
26760 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
26770 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
26780 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50  );..  assert( aP
26790 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e  ayload > pPage->
267a0 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28  aData );.  if( (
267b0 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d  uptr)(aPayload -
267c0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e   pPage->aData) >
267d0 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
267e0 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e - pCur->info.n
267f0 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
26800 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
26810 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
26820 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
26830 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  a is an error.  
26840 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69  The.    ** condi
26850 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20  tional above is 
26860 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20  really:.    **  
26870 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72    &aPayload[pCur
26880 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
26890 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
268a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
268b0 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65      ** but is re
268c0 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75  cast into its cu
268d0 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76  rrent form to av
268e0 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72  oid integer over
268f0 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20  flow problems.  
26900 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
26910 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
26920 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
26930 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
26940 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
26950 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
26960 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
26970 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
26980 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
26990 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
269a0 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
269b0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
269c0 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
269d0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
269e0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
269f0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
26a00 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
26a10 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
26a20 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
26a30 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
26a40 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
26a50 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
26a60 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
26a70 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
26a80 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
26a90 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
26aa0 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
26ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26ac0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
26ad0 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
26ae0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
26af0 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
26b00 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
26b10 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
26b20 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
26b30 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
26b40 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
26b50 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
26b60 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
26b70 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
26b80 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
26b90 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
26ba0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
26bb0 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
26bc0 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
26bd0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
26be0 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
26bf0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
26c00 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
26c10 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
26c20 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
26c30 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
26c40 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
26c50 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
26c60 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
26c70 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
26c80 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
26c90 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
26ca0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
26cb0 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
26cc0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
26cd0 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
26ce0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
26cf0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
26d00 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
26d10 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
26d20 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
26d30 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
26d40 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
26d50 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
26d60 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
26d70 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
26d80 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
26d90 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
26da0 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
26db0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
26dc0 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
26dd0 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
26de0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
26df0 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
26e00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
26e10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
26e20 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
26e30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
26e40 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
26e50 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20  = nOvfl*2;.     
26e60 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
26e70 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
26e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26e90 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
26ea0 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
26eb0 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
26ec0 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
26ed0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
26ee0 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
26ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
26f00 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
26f10 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26f20 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
26f30 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
26f40 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
26f50 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
26f60 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
26f70 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
26f80 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
26f90 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
26fa0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
26fb0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
26fc0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
26fd0 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
26fe0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
26ff0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
27000 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
27010 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
27020 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
27030 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
27040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
27050 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27060 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27070 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
27080 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
27090 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
270a0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
270b0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
270c0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
270d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
270e0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
270f0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
27100 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
27110 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
27120 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
27130 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
27140 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
27150 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
27160 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
27170 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
27180 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
27190 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
271a0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
271b0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
271c0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
271d0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
271e0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
271f0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
27200 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
27210 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
27220 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
27230 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
27240 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
27250 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
27260 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
27270 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
27280 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
27290 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
272a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
272b0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
272c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
272d0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
272e0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
272f0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
27300 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
27310 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
27320 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
27330 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27340 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
27350 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
27360 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27370 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
27380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
27390 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
273a0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
273b0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
273c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
273d0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
273e0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
273f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
27400 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
27410 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
27420 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
27430 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
27440 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
27450 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
27460 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
27470 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
27480 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
27490 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
274a0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
274b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
274c0 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
274d0 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69  /* File from whi
274e0 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74 20  ch to do direct 
274f0 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f  overflow read */
27500 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
27510 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
27520 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
27530 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
27540 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
27550 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
27560 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
27570 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27580 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27590 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
275a0 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
275b0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
275c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
275d0 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
275e0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
275f0 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
27600 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
27610 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
27620 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
27630 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
27640 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
27650 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
27660 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
27670 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
27680 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61  **   4) the data
27690 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
276a0 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
276b0 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67   **   5) the pag
276c0 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
276d0 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  WAL file.       
276e0 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73   **   6) at leas
276f0 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
27700 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
27710 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
27720 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
27730 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
27740 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
27750 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
27760 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
27770 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
27780 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
27790 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
277a0 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
277b0 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
277c0 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
277d0 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
277e0 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
277f0 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
27800 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
27810 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
27820 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27850 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
27860 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
27870 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
278a0 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
278b0 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
278c0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
278d0 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
278e0 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
278f0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
27900 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
27910 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
27920 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
27930 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
27940 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
27950 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42 74  3PagerUseWal(pBt
27960 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
27970 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35 29  ge)       /* (5)
27980 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
27990 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
279a0 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
279d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
279e0 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
279f0 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
27a00 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
27a10 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
27a20 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
27a30 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a50 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f  /* due to (6) */
27a60 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
27a70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
27a80 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
27a90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
27aa0 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
27ab0 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
27ac0 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
27ad0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
27ae0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
27af0 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
27b00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
27b10 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
27b20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
27b30 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
27b40 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
27b50 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
27b60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27b70 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
27b80 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
27b90 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
27ba0 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30           (eOp==0
27bb0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
27bc0 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
27bd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
27be0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27c00 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
27c10 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
27c20 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
27c30 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
27c40 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
27c50 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
27c60 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
27c70 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
27c80 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
27c90 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
27ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27cb0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
27cc0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
27cd0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
27ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27d00 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
27d10 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65   if( amt==0 ) re
27d20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
27d30 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
27d40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
27d50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27d60 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  iIdx++;.    }.  
27d70 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
27d80 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
27d90 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c  ){.    /* Overfl
27da0 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72  ow chain ends pr
27db0 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20  ematurely */.   
27dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27dd0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
27de0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
27df0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27e00 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
27e10 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
27e20 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
27e30 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
27e40 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
27e50 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
27e60 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
27e70 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
27e80 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
27e90 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
27ea0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
27eb0 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
27ec0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
27ed0 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
27ee0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
27ef0 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
27f00 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
27f10 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
27f20 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
27f30 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
27f40 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
27f50 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
27f60 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
27f70 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
27f80 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
27f90 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
27fa0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
27fb0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
27fc0 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
27fd0 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
27fe0 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
27ff0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28000 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
28010 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
28020 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
28030 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
28040 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
28050 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
28060 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
28070 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
28080 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
28090 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
280a0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
280b0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
280c0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
280d0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
280e0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
280f0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
28100 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28110 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
28120 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
28130 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
28140 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
28150 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28160 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
28170 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28180 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
281a0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
281b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
281c0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
281d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
281e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
281f0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
28200 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
28210 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
28220 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
28230 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
28240 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
28250 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20  This variant of 
28260 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28270 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e  oad() works even
28280 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
28290 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  as not.** in the
282a0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74   CURSOR_VALID st
282b0 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ate.  It is only
282c0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
282d0 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
282e0 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
282f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
28300 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73  _OMIT_INCRBLOB.s
28310 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
28320 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73  NLINE int access
28330 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a  PayloadChecked(.
28340 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
28350 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a  ,.  u32 offset,.
28360 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69    u32 amt,.  voi
28370 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  d *pBuf.){.  int
28380 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72   rc;.  if ( pCur
28390 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
283a0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
283b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
283c0 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
283d0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
283e0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
283f0 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
28400 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
28410 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
28420 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73   rc ? rc : acces
28430 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
28440 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
28450 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
28460 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
28470 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20  hecked(BtCursor 
28480 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
28490 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
284a0 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70   *pBuf){.  if( p
284b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
284c0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
284d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
284e0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
284f0 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
28500 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
28510 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
28520 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c   pBuf, 0);.  }el
28530 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  se{.    return a
28540 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
28550 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  ked(pCur, offset
28560 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20  , amt, pBuf);.  
28570 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
28580 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
28590 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
285a0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
285b0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
285c0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
285d0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
285e0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
285f0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
28600 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
28610 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
28620 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
28630 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
28640 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
28650 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
28660 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
28670 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
28680 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
28690 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
286a0 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
286b0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
286c0 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
286d0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
286e0 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
286f0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
28700 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
28710 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
28720 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
28730 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
28740 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
28750 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
28760 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
28770 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
28780 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
28790 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
287a0 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
287b0 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
287c0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
287d0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
287e0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
287f0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
28800 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
28810 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
28820 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
28830 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
28840 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
28850 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
28860 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
28870 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
28880 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
28890 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
288a0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
288b0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
288c0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
288d0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
288e0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
288f0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
28900 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
28910 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
28920 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
28930 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
28940 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
28950 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
28960 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
28970 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
28980 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
28990 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
289a0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
289b0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
289c0 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
289d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
289e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
289f0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
28a00 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
28a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28a20 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
28a30 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
28a40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28a50 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
28a60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28a70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28a80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28a90 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
28aa0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
28ab0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
28ac0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28ad0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28ae0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
28af0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28b00 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
28b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28b20 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
28b30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28b40 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28b50 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  >pCur->apPage[pC
28b60 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
28b70 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
28b80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28b90 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28ba0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
28bb0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
28bc0 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
28bd0 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
28be0 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  )(pCur->apPage[p
28bf0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
28c00 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
28c10 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20  fo.pPayload);.  
28c20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
28c30 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20  Local<amt ) amt 
28c40 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
28c50 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61  cal;.  *pAmt = a
28c60 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
28c70 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
28c80 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
28c90 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
28ca0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
28cb0 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
28cc0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
28cd0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
28ce0 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
28cf0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
28d00 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
28d10 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
28d20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
28d30 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
28d40 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
28d50 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
28d60 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
28d70 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
28d80 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
28d90 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
28da0 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
28db0 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
28dc0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
28dd0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
28de0 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
28df0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
28e00 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
28e10 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
28e20 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
28e30 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
28e40 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
28e50 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
28e60 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
28e70 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
28e80 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
28e90 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
28ea0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
28eb0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
28ec0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
28ed0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
28ee0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
28ef0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
28f00 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
28f10 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
28f20 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
28f30 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
28f40 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
28f50 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
28f60 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
28f70 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
28f80 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
28f90 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
28fa0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
28fb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28fc0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
28fd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
28fe0 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
28ff0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
29000 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
29010 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
29020 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
29030 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
29040 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
29050 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
29060 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
29070 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
29080 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
29090 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
290a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
290b0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
290c0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
290d0 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
290e0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
290f0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
29100 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
29110 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
29120 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29130 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29150 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
29160 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
29170 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29180 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Page>=0 );.  if(
29190 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
291a0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
291b0 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
291c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
291d0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43  T_BKPT;.  }.  pC
291e0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
291f0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
29200 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
29210 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
29220 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
29230 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29240 61 67 65 2b 2b 5d 20 3d 20 70 43 75 72 2d 3e 69  age++] = pCur->i
29250 78 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  x;.  pCur->ix = 
29260 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  0;.  return getA
29270 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
29280 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
29290 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
292a0 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75               pCu
292c0 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
292d0 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64  rFlags);.}..#ifd
292e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
292f0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
29300 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
29310 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
29320 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
29330 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
29340 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
29350 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
29360 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
29370 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
29380 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
29390 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
293a0 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
293b0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
293c0 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
293d0 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
293e0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
293f0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
29400 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
29410 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
29420 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
29430 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
29440 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
29450 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
29460 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
29470 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
29480 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
29490 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
294a0 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294c0 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
294d0 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
294e0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
294f0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
29500 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
29510 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
29520 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29530 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
29540 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
29550 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
29560 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
29570 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29580 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
29590 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
295a0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
295b0 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
295c0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
295d0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
295e0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
295f0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
29600 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
29610 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
29620 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
29630 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
29640 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
29650 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
29660 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
29670 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
29680 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
29690 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
296a0 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
296b0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
296c0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
296d0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
296e0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
296f0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
29700 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
29710 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
29720 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29730 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29740 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29750 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29760 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29770 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
29780 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29790 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
297a0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
297b0 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
297c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
297d0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
297e0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
297f0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
29800 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
29810 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
29820 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61  no.  );.  testca
29830 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
29840 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
29850 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29860 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
29870 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ell );.  pCur->i
29880 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
29890 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
298a0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
298b0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
298c0 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20  fl);.  pCur->ix 
298d0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
298e0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
298f0 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
29900 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
29910 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
29920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29930 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
29940 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
29950 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
29960 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
29970 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
29980 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
29990 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
299a0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
299b0 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
299c0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
299d0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
299e0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
299f0 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
29a00 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
29a10 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
29a20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
29a30 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
29a40 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
29a50 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
29a60 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
29a70 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
29a80 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
29a90 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
29aa0 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
29ab0 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
29ac0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
29ad0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
29ae0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
29af0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
29b00 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
29b10 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
29b20 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
29b30 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
29b40 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
29b50 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
29b60 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
29b70 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
29b80 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
29b90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
29ba0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
29bb0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
29bc0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
29bd0 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
29be0 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
29bf0 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
29c00 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
29c10 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
29c20 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
29c30 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
29c40 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
29c50 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
29c60 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
29c70 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
29c80 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
29c90 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
29ca0 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
29cb0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
29cc0 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
29cd0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
29ce0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
29cf0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
29d00 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
29d10 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
29d20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
29d30 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
29d40 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
29d50 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
29d60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29d70 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
29d80 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29d90 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
29da0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29db0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29dc0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
29dd0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
29de0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
29df0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
29e00 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
29e10 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
29e20 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
29e30 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
29e40 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
29e50 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
29e60 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
29e70 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
29e80 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
29e90 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
29ea0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29eb0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
29ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
29ed0 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
29ee0 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  skipNext;.    }.
29ef0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
29f00 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
29f10 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
29f20 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
29f30 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
29f40 61 67 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b  age ){.      do{
29f50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29f60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29f70 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b  ur->iPage]!=0 );
29f80 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
29f90 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
29fa0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29fb0 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 20 20  Page--]);.      
29fc0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50  }while( pCur->iP
29fd0 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  age);.      goto
29fe0 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20   skip_init;.    
29ff0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
2a000 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2a010 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2a020 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2a030 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
2a040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2a050 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2a060 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
2a070 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  1) );.    rc = g
2a080 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
2a090 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
2a0a0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2a0b0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
2a0c0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
2a0d0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
2a0e0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2a0f0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
2a100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a110 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2a120 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2a130 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
2a140 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
2a150 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
2a160 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
2a170 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ey = pCur->apPag
2a180 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20  e[0]->intKey;.  
2a190 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
2a1a0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
2a1b0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
2a1c0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
2a1d0 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
2a1e0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
2a1f0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
2a200 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
2a210 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
2a220 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
2a230 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
2a240 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
2a250 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
2a260 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
2a270 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
2a280 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
2a290 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
2a2a0 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
2a2b0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
2a2c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
2a2d0 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
2a2e0 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
2a2f0 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
2a300 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
2a310 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
2a320 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
2a330 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
2a340 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
2a350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
2a360 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
2a370 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
2a380 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
2a390 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
2a3a0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2a3b0 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
2a3c0 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
2a3d0 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
2a3e0 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
2a3f0 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
2a400 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
2a410 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
2a420 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
2a430 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
2a440 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
2a450 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
2a460 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
2a470 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
2a480 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
2a490 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a4a0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
2a4b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a4c0 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 29 3b  ->iPage]->pgno);
2a4d0 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a  .  }..skip_init:
2a4e0 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20    .  pCur->ix = 
2a4f0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
2a500 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2a510 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a520 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2a530 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2a540 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
2a550 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
2a560 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66 28 20 70  Page[0];.  if( p
2a570 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
2a580 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2a590 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2a5a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
2a5b0 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
2a5c0 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
2a5d0 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
2a5e0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
2a5f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2a600 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
2a610 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
2a620 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
2a630 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2a640 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2a650 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2a660 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2a670 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
2a680 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2a690 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2a6a0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2a6b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a6c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
2a6d0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2a6e0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
2a6f0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2a700 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
2a710 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
2a720 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2a730 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
2a740 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
2a750 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2a760 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
2a770 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2a780 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
2a790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a7a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
2a7b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2a7c0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
2a7d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a7e0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
2a7f0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2a800 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2a810 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2a820 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2a830 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2a840 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
2a850 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
2a860 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2a870 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a880 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
2a890 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2a8a0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2a8b0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2a8c0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2a8d0 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b  age, pCur->ix));
2a8e0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2a8f0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2a900 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a910 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2a920 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2a930 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
2a940 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2a950 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
2a960 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
2a970 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2a980 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
2a990 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
2a9a0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
2a9b0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
2a9c0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
2a9d0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2a9e0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
2a9f0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
2aa00 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
2aa10 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
2aa20 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
2aa30 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
2aa40 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2aa50 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
2aa60 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
2aa70 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
2aa80 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
2aa90 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
2aaa0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
2aab0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2aac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2aad0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
2aae0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2aaf0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2ab00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ab10 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2ab20 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
2ab30 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2ab40 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2ab50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2ab60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2ab70 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2ab80 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2ab90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2aba0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
2abb0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2abc0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2abd0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2abe0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2abf0 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ix = pPage->nCel
2ac00 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
2ac10 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2ac20 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
2ac30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
2ac40 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50  .  pCur->ix = pP
2ac50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2ac60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2ac70 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2ac80 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2ac90 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2aca0 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
2acb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2acc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
2acd0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2ace0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2acf0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2ad00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2ad10 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2ad20 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2ad30 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2ad40 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2ad50 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2ad60 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2ad70 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2ad80 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2ad90 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
2ada0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2adb0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2adc0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
2add0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ade0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2adf0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ae00 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2ae10 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2ae20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
2ae30 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2ae40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ae50 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2ae60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ae70 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
2ae80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2ae90 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2aea0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2aeb0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2aec0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2aed0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2aee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2aef0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2af00 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
2af10 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2af20 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2af30 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2af40 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
2af50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2af60 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2af70 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
2af80 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2af90 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2afa0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2afb0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2afc0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2afd0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2afe0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2aff0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2b000 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2b010 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2b020 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
2b030 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
2b040 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2b050 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
2b060 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2b070 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2b080 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b090 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2b0a0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2b0b0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2b0c0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
2b0d0 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
2b0e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
2b0f0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
2b100 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
2b110 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
2b120 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
2b130 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2b140 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
2b150 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2b160 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
2b170 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
2b180 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
2b190 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
2b1a0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
2b1b0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2b1c0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
2b1d0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
2b1e0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
2b1f0 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
2b200 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2b210 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2b220 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
2b230 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
2b240 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2b250 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72  ( pCur->ix==pCur
2b260 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b270 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
2b280 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2b290 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b2a0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
2b2b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2b2c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b2d0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2b2e0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2b2f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b300 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
2b310 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2b320 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2b330 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2b340 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2b350 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b360 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2b370 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2b380 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2b390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b3a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b3b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
2b3c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2b3d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2b3e0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2b3f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b410 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2b420 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
2b430 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b440 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2b450 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2b460 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
2b470 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
2b480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2b490 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2b4a0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2b4b0 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2b4c0 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2b4d0 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2b4e0 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2b4f0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2b500 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2b510 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2b520 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2b530 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2b540 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2b550 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2b560 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2b570 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2b580 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2b590 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2b5a0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2b5b0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2b5c0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2b5d0 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2b5e0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2b5f0 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2b600 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2b610 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2b620 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2b630 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2b640 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2b650 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2b660 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2b670 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2b680 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2b690 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2b6a0 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2b6b0 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2b6c0 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2b6d0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2b6e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2b6f0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2b700 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2b710 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2b720 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2b730 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2b740 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2b750 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2b760 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2b770 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2b780 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2b790 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2b7a0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2b7b0 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2b7c0 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7e0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2b7f0 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2b800 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2b810 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2b820 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2b830 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2b840 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2b850 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2b860 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2b870 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2b880 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2b890 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2b8a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2b8b0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2b8c0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2b8d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2b8e0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2b8f0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2b900 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2b910 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2b920 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2b930 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2b940 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2b950 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2b960 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2b970 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2b980 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2b990 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2b9a0 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2b9b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2b9c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2b9d0 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2b9e0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2b9f0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2ba00 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2ba10 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2ba20 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2ba30 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2ba40 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2ba50 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2ba60 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2ba70 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2ba80 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2ba90 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2bab0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2bac0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2bad0 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2bae0 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2baf0 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2bb00 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2bb10 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2bb20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2bb30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2bb40 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2bb50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2bb60 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2bb70 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2bb80 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2bb90 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  fo==0) );.  asse
2bba0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2bbb0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2bbc0 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  | (pIdxKey==0)==
2bbd0 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  (pCur->curIntKey
2bbe0 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  !=0) );..  /* If
2bbf0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2bc00 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2bc10 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2bc20 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2bc30 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2bc40 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2bc50 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2bc60 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2bc70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20  IdxKey==0.   && 
2bc80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2bc90 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2bca0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2bcb0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2bcc0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  =0.  ){.    if( 
2bcd0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2bce0 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2bcf0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2bd00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bd10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2bd20 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2bd30 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2bd40 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2bd50 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2bd60 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ast)!=0 ){.     
2bd70 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2bd80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2bd90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2bda0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2bdb0 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69   requested key i
2bdc0 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  s one more than 
2bdd0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79  the previous key
2bde0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
2bdf0 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65  try to get there
2be00 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74   using sqlite3Bt
2be10 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72  reeNext() rather
2be20 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20   than a full.   
2be30 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61     ** binary sea
2be40 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rch.  This is an
2be50 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
2be60 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74  ly.  The correct
2be70 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a   answer.      **
2be80 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e   is still obtain
2be90 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ed without this 
2bea0 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74  case, only a lit
2beb0 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79  tle more slowely
2bec0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2bed0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d  ur->info.nKey+1=
2bee0 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72  =intKey && !pCur
2bef0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2bf00 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2bf10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2bf20 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2bf30 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
2bf40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bf50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2bf60 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
2bf70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2bf80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2bf90 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2bfa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2bfb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2bfc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2bfd0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2bfe0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
2bff0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c000 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
2c010 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2c020 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2c030 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c040 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2c050 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2c060 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2c070 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2c080 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2c090 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2c0a0 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2c0b0 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2c0c0 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2c0d0 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2c0e0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2c0f0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2c100 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2c110 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2c120 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2c130 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2c140 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2c150 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2c160 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2c170 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2c180 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2c190 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2c1a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2c1b0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2c1c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
2c1d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c1e0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2c1f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c200 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
2c210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c220 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2c230 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
2c240 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2c250 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2c260 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2c270 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2c280 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
2c290 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
2c2a0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2c2b0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2c2c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c2d0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2c2e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2c2f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
2c300 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2c310 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2c320 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2c330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c340 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2c350 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2c360 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2c370 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2c380 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2c390 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2c3a0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2c3b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2c3c0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2c3f0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2c400 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2c410 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2c420 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2c430 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2c440 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2c450 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2c460 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2c470 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2c480 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2c490 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2c4a0 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2c4b0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2c4c0 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2c4d0 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2c4e0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2c4f0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2c500 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2c510 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2c520 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2c530 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2c540 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2c550 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2c560 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2c570 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2c580 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2c590 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2c5a0 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2c5b0 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2c5c0 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2c5d0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2c5e0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2c5f0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2c600 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2c610 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2c620 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2c630 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2c640 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2c650 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2c660 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2c670 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2c680 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2c690 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2c6a0 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2c6b0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2c6c0 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2c6d0 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2c6e0 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2c6f0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2c700 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2c710 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2c720 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2c730 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2c740 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2c750 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2c760 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2c770 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2c780 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2c790 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2c7a0 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
2c7b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c7c0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
2c7d0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
2c7e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c7f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c800 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
2c810 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
2c820 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
2c830 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
2c840 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2c850 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2c860 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c870 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
2c880 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2c890 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
2c8a0 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
2c8b0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2c8c0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2c8d0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2c8e0 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
2c8f0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2c900 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c910 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
2c920 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
2c930 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2c940 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2c950 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c970 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2c980 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c990 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2c9a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2c9c0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2c9d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
2c9e0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c9f0 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
2ca00 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2ca10 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2ca20 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
2ca30 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2ca40 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2ca50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2ca60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ca70 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2ca80 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2ca90 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2caa0 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2cab0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2cac0 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
2cad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cae0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2caf0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20   int nCell;  /* 
2cb00 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c  Size of the pCel
2cb10 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20  l cell in bytes 
2cb20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  */.        pCell
2cb30 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2cb40 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2cb50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2cb60 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2cb70 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2cb80 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2cb90 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2cba0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2cbb0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2cbc0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2cbd0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2cbe0 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2cbf0 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2cc00 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2cc10 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2cc20 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2cc30 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2cc40 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2cc50 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2cc60 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2cc70 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2cc80 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2cc90 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2cca0 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2ccb0 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2ccc0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2ccd0 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2cce0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2ccf0 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2cd00 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2cd10 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2cd20 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2cd30 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2cd40 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2cd50 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2cd60 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2cd70 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2cd80 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2cd90 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2cda0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2cdb0 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2cdc0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2cdd0 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2cde0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2cdf0 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2ce00 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2ce10 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2ce20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2ce30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2ce40 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2ce50 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2ce60 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2ce70 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2ce80 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2ce90 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2cea0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2ceb0 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2cec0 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2ced0 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2cee0 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2cef0 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2cf00 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2cf10 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2cf20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2cf30 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2cf40 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2cf50 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2cf60 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2cf70 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2cf80 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2cf90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2cfa0 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2cfb0 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2cfc0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2cfd0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2cfe0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2cff0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2d000 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2d010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d020 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2d030 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2d040 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2d050 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2d060 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2d070 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2d080 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2d090 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2d0a0 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2d0b0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2d0c0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2d0d0 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2d0e0 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2d0f0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2d100 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2d110 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2d120 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2d130 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2d140 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2d150 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2d160 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2d170 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2d180 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2d190 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2d1a0 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2d1b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2d1c0 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2d1d0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2d1e0 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2d1f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2d200 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2d210 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2d220 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2d230 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2d240 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2d250 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2d260 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2d270 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2d280 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2d290 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2d2a0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2d2b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2d2c0 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2d2d0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2d2e0 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2d2f0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2d300 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2d310 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2d320 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2d330 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2d340 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2d350 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2d360 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2d370 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2d380 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2d390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2d3a0 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2d3b0 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2d3c0 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2d3d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2d3e0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2d3f0 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2d400 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2d410 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2d420 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2d430 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2d440 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d450 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
2d460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2d470 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2d480 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2d490 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
2d4a0 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
2d4b0 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20  c( nCell+18 );. 
2d4c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2d4d0 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
2d4e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2d4f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2d500 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d510 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2d520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d530 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
2d540 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2d550 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
2d560 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
2d570 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
2d580 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
2d590 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2d5a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d5b0 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  = ~BTCF_ValidOvf
2d5c0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  l;.          if(
2d5d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2d5e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d5f0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
2d600 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2d610 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2d620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d630 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2d640 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
2d650 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
2d660 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d670 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2d680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d690 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
2d6a0 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79          (pIdxKey
2d6b0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2d6c0 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d  E_CORRUPT || c==
2d6d0 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
2d6e0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2d6f0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  !=SQLITE_NOMEM |
2d700 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  | pCur->pBtree->
2d710 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d720 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2d730 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
2d740 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2d750 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx+1;.        }
2d760 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
2d770 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2d780 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
2d790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d7a0 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a  assert( c==0 );.
2d7b0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2d7c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
2d7d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d7e0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2d7f0 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2d800 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
2d810 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  Key->errCode ) r
2d820 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2d830 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
2d840 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2d850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d860 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2d870 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2d880 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2d890 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2d8a0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2d8b0 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2d8c0 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
2d8d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
2d8e0 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
2d8f0 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
2d900 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2d910 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
2d920 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2d930 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2d940 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2d950 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2d960 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  x<pCur->apPage[p
2d970 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2d980 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
2d990 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2d9a0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
2d9b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2d9c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
2d9d0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2d9e0 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
2d9f0 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
2da00 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
2da10 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
2da20 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2da30 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2da40 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2da50 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2da60 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2da70 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2da80 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
2da90 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78    }.    pCur->ix
2daa0 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
2dab0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2dac0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
2dad0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
2dae0 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
2daf0 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
2db00 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2db10 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2db20 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2db30 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2db40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2db50 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2db60 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2db70 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2db80 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2db90 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2dba0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2dbb0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2dbc0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2dbd0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2dbe0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2dbf0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2dc00 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2dc10 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2dc20 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2dc30 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2dc40 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2dc50 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2dc60 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2dc70 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2dc80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2dc90 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2dca0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2dcb0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2dcc0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2dcd0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2dce0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2dcf0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2dd00 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2dd10 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2dd20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2dd30 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2dd40 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2dd50 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2dd60 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2dd70 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2dd80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2dd90 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72   an estimate for
2dda0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2ddb0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2ddc0 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
2ddd0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52   pointing to.  R
2dde0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2ddf0 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73   number if no es
2de00 74 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e  timate is curren
2de10 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  tly .** availabl
2de20 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  e..*/.i64 sqlite
2de30 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73  3BtreeRowCountEs
2de40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2de50 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38  ){.  i64 n;.  u8
2de60 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   i;..  assert( c
2de70 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2de80 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2de90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2dea0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2deb0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2dec0 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e   );..  /* Curren
2ded0 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61  tly this interfa
2dee0 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ce is only calle
2def0 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d  d by the OP_IfSm
2df00 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64  aller.  ** opcod
2df10 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63  e, and it that c
2df20 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  ase the cursor w
2df30 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61  ill always be va
2df40 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c  lid and.  ** wil
2df50 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74  l always point t
2df60 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a  o a leaf node. *
2df70 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  /.  if( NEVER(pC
2df80 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2df90 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75  OR_VALID) ) retu
2dfa0 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56  rn -1;.  if( NEV
2dfb0 45 52 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ER(pCur->apPage[
2dfc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2dfd0 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  af==0) ) return 
2dfe0 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e 3d 31 2c 20  -1;..  for(n=1, 
2dff0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
2e000 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  age; i++){.    n
2e010 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65   *= pCur->apPage
2e020 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  [i]->nCell;.  }.
2e030 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
2e040 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2e050 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2e060 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2e070 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52   database. .** R
2e080 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a  eturn value:.**.
2e090 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  **    SQLITE_OK 
2e0a0 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a         success.*
2e0b0 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45  *    SQLITE_DONE
2e0c0 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73 20        cursor is 
2e0d0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2e0e0 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65   at the last ele
2e0f0 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72  ment.**    other
2e100 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65  wise        some
2e110 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
2e120 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
2e130 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2e140 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2e150 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
2e160 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2e170 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2e180 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2e190 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
2e1a0 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2e1b0 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2e1c0 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
2e1d0 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
2e1e0 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2e1f0 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
2e200 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
2e210 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2e220 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2e230 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2e240 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2e250 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
2e260 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2e270 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
2e280 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
2e290 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ent in sqlite3Bt
2e2a0 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20  reeNext(C,F) is 
2e2b0 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63  1, then the.** c
2e2c0 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2e2d0 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2e2e0 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
2e2f0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2e300 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
2e310 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
2e320 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
2e330 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
2e340 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
2e350 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
2e360 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62  ement.  SQLite b
2e370 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2e380 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ion does not use
2e390 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62  .** this hint, b
2e3a0 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
2e3b0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2e3c0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2e3d0 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2e3e0 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
2e3f0 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2e400 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2e410 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2e420 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2e430 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2e440 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2e450 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2e460 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e470 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2e480 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e490 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2e4a0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2e4b0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2e4c0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2e4d0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2e4e0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2e4f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e510 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e520 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2e530 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2e540 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2e550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2e560 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
2e570 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e580 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e590 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e5a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2e5b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2e5c0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2e5d0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2e5e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2e5f0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2e600 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2e610 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2e620 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2e630 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e640 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2e650 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2e660 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2e670 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2e680 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e690 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2e6a0 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20  = ++pCur->ix;.  
2e6b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2e6c0 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2e6d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2e6e0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2e6f0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2e700 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2e710 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2e720 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2e730 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2e740 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2e750 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2e760 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2e770 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2e780 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2e790 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2e7a0 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2e7b0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2e7c0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2e7d0 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2e7e0 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2e7f0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2e800 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2e810 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2e820 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2e830 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2e840 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2e850 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2e860 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e870 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2e880 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2e890 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2e8a0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2e8b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2e8c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2e8d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2e8e0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2e8f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2e900 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2e910 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2e920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2e930 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2e940 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2e950 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e960 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
2e970 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2e980 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2e990 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e9a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e9b0 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
2e9c0 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65   pCur->ix>=pPage
2e9d0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
2e9e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2e9f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ea00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2ea10 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  t(pCur, 0);.    
2ea20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2ea30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ea40 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2ea50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2ea60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ea70 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2ea80 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2ea90 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2eaa0 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2eab0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2eac0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
2ead0 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gs){.  MemPage *
2eae0 70 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f  pPage;.  UNUSED_
2eaf0 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73  PARAMETER( flags
2eb00 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20   );  /* Used in 
2eb10 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e  COMDB2 but not n
2eb20 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a  ative SQLite */.
2eb30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2eb40 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2eb50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2eb60 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
2eb70 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2eb80 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2eb90 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2eba0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2ebb0 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2ebc0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2ebd0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2ebe0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2ebf0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2ec00 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2ec10 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2ec20 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
2ec30 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
2ec40 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2ec50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ec60 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  ];.  if( (++pCur
2ec70 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->ix)>=pPage->nC
2ec80 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
2ec90 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  >ix--;.    retur
2eca0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2ecb0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2ecc0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ecd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ece0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2ecf0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2ed00 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2ed10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2ed20 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2ed30 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2ed40 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2ed50 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52  e database..** R
2ed60 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a  eturn values:.**
2ed70 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
2ed80 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a  K     success.**
2ed90 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45       SQLITE_DONE
2eda0 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73     the cursor is
2edb0 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20   already on the 
2edc0 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
2edd0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
2ede0 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
2edf0 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
2ee00 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
2ee10 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2ee20 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2ee30 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2ee40 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2ee50 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2ee60 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2ee70 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2ee80 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2ee90 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2eea0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2eeb0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2eec0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2eed0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2eee0 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2eef0 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2ef00 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2ef10 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2ef20 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2ef30 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2ef40 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2ef50 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2ef60 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
2ef70 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
2ef80 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74  ent to sqlite3Bt
2ef90 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29  reePrevious(C,F)
2efa0 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74   is 1, then.** t
2efb0 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  he cursor corres
2efc0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2efd0 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
2efe0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2eff0 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
2f000 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
2f010 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
2f020 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
2f030 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61   F argument is a
2f040 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20  .** hint to the 
2f050 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20  implement.  The 
2f060 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62 74  native SQLite bt
2f070 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2f080 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75  on does not.** u
2f090 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75  se this hint, bu
2f0a0 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a  t COMDB2 does..*
2f0b0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2f0c0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2f0d0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2f0e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2f0f0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2f100 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2f110 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2f120 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2f130 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2f140 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2f150 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f160 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2f170 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2f180 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74  Flags & (BTCF_At
2f190 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
2f1a0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
2f1b0 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ey))==0 );.  ass
2f1c0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2f1d0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nSize==0 );.  if
2f1e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2f1f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2f200 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2f210 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2f220 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2f230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f240 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f250 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2f260 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2f270 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2f280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f290 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
2f2a0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2f2b0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2f2c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2f2d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2f2e0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2f2f0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2f300 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2f310 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2f320 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2f330 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2f340 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
2f350 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2f360 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2f370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2f380 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2f390 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2f3a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2f3b0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2f3c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2f3d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2f3e0 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
2f3f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f400 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
2f410 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20  r->ix;.    rc = 
2f420 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2f430 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
2f440 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
2f450 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2f470 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2f480 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
2f490 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
2f4a0 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20  Cur->ix==0 ){.  
2f4b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2f4c0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2f4d0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f4e0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2f4f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f500 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2f510 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2f520 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2f530 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2f540 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2f550 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
2f560 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2f570 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
2f580 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
2f590 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
2f5a0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2f5b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2f5c0 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
2f5d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2f5e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f5f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f600 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
2f610 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
2f620 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2f630 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2f640 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f650 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2f660 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2f670 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2f680 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
2f690 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2f6a0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2f6b0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
2f6c0 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
2f6d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f6e0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2f6f0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f700 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55  SOR_VALID );.  U
2f710 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f720 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
2f730 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
2f740 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
2f750 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75  te */.  pCur->cu
2f760 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2f770 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2f780 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2f790 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
2f7a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2f7b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f7c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f7d0 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
2f7e0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
2f7f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f800 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
2f810 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2f820 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b  ePrevious(pCur);
2f830 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d  .  }.  pCur->ix-
2f840 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2f850 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
2f860 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45   SQLITE_SERVER_E
2f870 44 49 54 49 4f 4e 0a 0a 23 64 65 66 69 6e 65 20  DITION..#define 
2f880 53 45 52 56 45 52 5f 44 45 46 41 55 4c 54 5f 46  SERVER_DEFAULT_F
2f890 52 45 45 4c 49 53 54 53 20 20 20 20 20 20 31 36  REELISTS      16
2f8a0 0a 23 64 65 66 69 6e 65 20 53 45 52 56 45 52 5f  .#define SERVER_
2f8b0 44 45 46 41 55 4c 54 5f 46 52 45 45 4c 49 53 54  DEFAULT_FREELIST
2f8c0 5f 53 49 5a 45 20 31 32 38 0a 0a 2f 2a 0a 2a 2a  _SIZE 128../*.**
2f8d0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 66 72   Allocate the fr
2f8e0 65 65 2d 6e 6f 64 65 20 61 6e 64 20 74 68 65 20  ee-node and the 
2f8f0 66 69 72 73 74 20 53 45 52 56 45 52 5f 44 45 46  first SERVER_DEF
2f900 41 55 4c 54 5f 46 52 45 45 4c 49 53 54 53 20 0a  AULT_FREELISTS .
2f910 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 73 2e 0a  ** trunk pages..
2f920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2f930 6c 6f 63 61 74 65 53 65 72 76 65 72 46 72 65 65  locateServerFree
2f940 6e 6f 64 65 28 42 74 53 68 61 72 65 64 20 2a 70  node(BtShared *p
2f950 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Bt){.  int rc;. 
2f960 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2f970 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
2f980 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2f990 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
2f9a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2f9b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f9c0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2f9d0 4e 6f 64 65 20 3d 20 28 2b 2b 70 42 74 2d 3e 6e  Node = (++pBt->n
2f9e0 50 61 67 65 29 3b 0a 20 20 20 20 4d 65 6d 50 61  Page);.    MemPa
2f9f0 67 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 20  ge *pNode = 0;. 
2fa00 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 70     int i;..    p
2fa10 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2fa20 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 67 6e 6f  >aData[32], pgno
2fa30 4e 6f 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Node);.    rc = 
2fa40 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
2fa50 67 65 28 70 42 74 2c 20 70 67 6e 6f 4e 6f 64 65  ge(pBt, pgnoNode
2fa60 2c 20 26 70 4e 6f 64 65 2c 20 50 41 47 45 52 5f  , &pNode, PAGER_
2fa70 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a  GET_NOCONTENT);.
2fa80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fa90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2faa0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fab0 57 72 69 74 65 28 70 4e 6f 64 65 2d 3e 70 44 62  Write(pNode->pDb
2fac0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2fad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fae0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  OK ){.      put4
2faf0 62 79 74 65 28 26 70 4e 6f 64 65 2d 3e 61 44 61  byte(&pNode->aDa
2fb00 74 61 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ta[0], 0);.     
2fb10 20 70 75 74 34 62 79 74 65 28 26 70 4e 6f 64 65   put4byte(&pNode
2fb20 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 53 45 52 56  ->aData[4], SERV
2fb30 45 52 5f 44 45 46 41 55 4c 54 5f 46 52 45 45 4c  ER_DEFAULT_FREEL
2fb40 49 53 54 53 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ISTS);.    }.   
2fb50 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
2fb60 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 53 45 52  LITE_OK && i<SER
2fb70 56 45 52 5f 44 45 46 41 55 4c 54 5f 46 52 45 45  VER_DEFAULT_FREE
2fb80 4c 49 53 54 53 3b 20 69 2b 2b 29 7b 0a 20 20 20  LISTS; i++){.   
2fb90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75     MemPage *pTru
2fba0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 67  nk = 0;.      Pg
2fbb0 6e 6f 20 70 67 6e 6f 54 72 75 6e 6b 3b 0a 20 20  no pgnoTrunk;.  
2fbc0 20 20 20 20 69 66 28 20 2b 2b 70 42 74 2d 3e 6e      if( ++pBt->n
2fbd0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
2fbe0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
2fbf0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
2fc00 20 20 20 70 67 6e 6f 54 72 75 6e 6b 20 3d 20 70     pgnoTrunk = p
2fc10 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
2fc20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2fc30 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
2fc40 67 6e 6f 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  gnoTrunk, &pTrun
2fc50 6b 2c 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  k, PAGER_GET_NOC
2fc60 4f 4e 54 45 4e 54 29 3b 0a 20 20 20 20 20 20 69  ONTENT);.      i
2fc70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fc80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2fc90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2fca0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2fcb0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
2fcc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fcd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fce0 6d 65 6d 73 65 74 28 70 54 72 75 6e 6b 2d 3e 61  memset(pTrunk->a
2fcf0 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20  Data, 0, 8);.   
2fd00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2fd10 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 38 2b 69 2a  Node->aData[8+i*
2fd20 34 5d 2c 20 70 67 6e 6f 54 72 75 6e 6b 29 3b 0a  4], pgnoTrunk);.
2fd30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2fd40 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2fd50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
2fd60 65 61 73 65 50 61 67 65 28 70 4e 6f 64 65 29 3b  easePage(pNode);
2fd70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2fd80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2fd90 72 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  rn a reference t
2fda0 6f 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  o the first trun
2fdb0 6b 20 70 61 67 65 20 69 6e 20 6f 6e 65 20 6f 66  k page in one of
2fdc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
2fdd0 65 65 2d 6c 69 73 74 73 2e 0a 2a 2a 20 41 6c 6c  ee-lists..** All
2fde0 6f 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ocate the databa
2fdf0 73 65 20 66 72 65 65 2d 6c 69 73 74 73 20 69 66  se free-lists if
2fe00 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
2fe10 61 74 69 63 20 69 6e 74 20 66 69 6e 64 53 65 72  atic int findSer
2fe20 76 65 72 54 72 75 6e 6b 28 42 74 53 68 61 72 65  verTrunk(BtShare
2fe30 64 20 2a 70 42 74 2c 20 69 6e 74 20 62 41 6c 6c  d *pBt, int bAll
2fe40 6f 63 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  oc, MemPage **pp
2fe50 54 72 75 6e 6b 29 7b 0a 20 20 4d 65 6d 50 61 67  Trunk){.  MemPag
2fe60 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
2fe70 3e 70 50 61 67 65 31 3b 0a 20 20 4d 65 6d 50 61  >pPage1;.  MemPa
2fe80 67 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 20 20  ge *pNode = 0;  
2fe90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fea0 65 20 6e 6f 64 65 20 70 61 67 65 20 2a 2f 0a 20  e node page */. 
2feb0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
2fec0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2fed0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64   /* The returned
2fee0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
2fef0 69 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  iNode;          
2ff00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2ff10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64  ge number of nod
2ff20 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
2ff30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ff40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 6f 64  .  /* If the nod
2ff50 65 20 70 61 67 65 20 61 6e 64 20 66 72 65 65 2d  e page and free-
2ff60 6c 69 73 74 20 74 72 75 6e 6b 73 20 68 61 76 65  list trunks have
2ff70 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 61 6c   not yet been al
2ff80 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
2ff90 65 0a 20 20 2a 2a 20 74 68 65 6d 20 6e 6f 77 2e  e.  ** them now.
2ffa0 20 20 2a 2f 0a 20 20 70 50 61 67 65 31 20 3d 20    */.  pPage1 = 
2ffb0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69  pBt->pPage1;.  i
2ffc0 4e 6f 64 65 20 3d 20 67 65 74 34 62 79 74 65 28  Node = get4byte(
2ffd0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2ffe0 32 5d 29 3b 0a 20 20 69 66 28 20 69 4e 6f 64 65  2]);.  if( iNode
2fff0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
30000 61 6c 6c 6f 63 61 74 65 53 65 72 76 65 72 46 72  allocateServerFr
30010 65 65 6e 6f 64 65 28 70 42 74 29 3b 0a 20 20 20  eenode(pBt);.   
30020 20 69 4e 6f 64 65 20 3d 20 67 65 74 34 62 79 74   iNode = get4byt
30030 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
30040 5b 33 32 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  [32]);.  }..  /*
30050 20 47 72 61 62 20 74 68 65 20 6e 6f 64 65 20 70   Grab the node p
30060 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  age */.  if( rc=
30070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30080 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
30090 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
300a0 4e 6f 64 65 2c 20 26 70 4e 6f 64 65 2c 20 30 29  Node, &pNode, 0)
300b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
300c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
300d0 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
300e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
300f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  * Number of free
30100 2d 6c 69 73 74 73 20 69 6e 20 74 68 69 73 20 64  -lists in this d
30110 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  b */.    int i;.
30120 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 6c  .    /* Try to l
30130 6f 63 6b 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ock a free-list 
30140 74 72 75 6e 6b 2e 20 49 66 20 62 41 6c 6c 6f 63  trunk. If bAlloc
30150 20 69 73 20 74 72 75 65 2c 20 69 74 20 68 61 73   is true, it has
30160 20 74 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20   to be a.    ** 
30170 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
30180 77 69 74 68 20 61 74 20 6c 65 61 73 74 20 6f 6e  with at least on
30190 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 66  e entry in the f
301a0 72 65 65 2d 6c 69 73 74 2e 20 2a 2f 0a 20 20 20  ree-list. */.   
301b0 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 67 65   nList = (int)ge
301c0 74 34 62 79 74 65 28 26 70 4e 6f 64 65 2d 3e 61  t4byte(&pNode->a
301d0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 66 6f  Data[4]);.    fo
301e0 72 28 69 3d 30 3b 20 69 3c 6e 4c 69 73 74 3b 20  r(i=0; i<nList; 
301f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
30200 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
30210 74 65 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61  te(&pNode->aData
30220 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
30230 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73  if( SQLITE_OK==s
30240 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6c  qlite3PagerPagel
30250 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ock(pBt->pPager,
30260 20 69 54 72 75 6e 6b 2c 20 31 29 20 29 7b 0a 20   iTrunk, 1) ){. 
30270 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
30280 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
30290 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
302a0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
302b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
302c0 4f 4b 20 26 26 20 62 41 6c 6c 6f 63 20 29 7b 0a  OK && bAlloc ){.
302d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 67            if( !g
302e0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
302f0 3e 61 44 61 74 61 5b 30 5d 29 20 26 26 20 21 67  >aData[0]) && !g
30300 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
30310 3e 61 44 61 74 61 5b 34 5d 29 20 29 7b 0a 20 20  >aData[4]) ){.  
30320 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
30330 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
30340 20 20 20 20 20 20 20 20 20 20 20 70 54 72 75 6e             pTrun
30350 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
30360 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30370 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30380 49 54 45 5f 4f 4b 20 7c 7c 20 70 54 72 75 6e 6b  ITE_OK || pTrunk
30390 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
303a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
303b0 4e 6f 20 66 72 65 65 20 70 61 67 65 73 20 69 6e  No free pages in
303c0 20 61 6e 79 20 66 72 65 65 2d 6c 69 73 74 2e 20   any free-list. 
303d0 4f 72 20 70 65 72 68 61 70 73 20 77 65 20 77 65  Or perhaps we we
303e0 72 65 20 6c 6f 63 6b 65 64 20 6f 75 74 2e 20 49  re locked out. I
303f0 6e 20 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72  n .    ** either
30400 20 63 61 73 65 2c 20 74 72 79 20 74 6f 20 61 6c   case, try to al
30410 6c 6f 63 61 74 65 20 6d 6f 72 65 20 66 72 6f 6d  locate more from
30420 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30430 66 69 6c 65 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20  file now.  */.  
30440 20 20 69 66 28 20 69 3d 3d 6e 4c 69 73 74 20 29    if( i==nList )
30450 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30470 20 70 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20   pTrunk==0 );.  
30480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30490 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
304a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
304b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
304c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
304d0 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  List; i++){.    
304e0 20 20 20 20 2f 2a 20 41 64 64 20 73 6f 6d 65 20      /* Add some 
304f0 66 72 65 65 20 70 61 67 65 73 20 74 6f 20 65 61  free pages to ea
30500 63 68 20 66 72 65 65 2d 6c 69 73 74 2e 20 4e 6f  ch free-list. No
30510 20 73 65 72 76 65 72 2d 6c 6f 63 6b 73 20 61 72   server-locks ar
30520 65 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  e required.     
30530 20 20 20 2a 2a 20 74 6f 20 64 6f 20 74 68 69 73     ** to do this
30540 20 61 73 20 77 65 20 68 61 76 65 20 61 20 77 72   as we have a wr
30550 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65  ite-lock on page
30560 20 31 20 2d 20 67 75 61 72 61 6e 74 65 65 69 6e   1 - guaranteein
30570 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63  g.        ** exc
30580 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 74 6f  lusive access to
30590 20 74 68 65 20 64 62 20 66 69 6c 65 2e 20 20 2a   the db file.  *
305a0 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  /.        MemPag
305b0 65 20 2a 70 54 20 3d 20 30 3b 0a 20 20 20 20 20  e *pT = 0;.     
305c0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d     Pgno iTrunk =
305d0 20 67 65 74 34 62 79 74 65 28 26 70 4e 6f 64 65   get4byte(&pNode
305e0 2d 3e 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  ->aData[8+i*4]);
305f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
30600 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30610 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
30620 54 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  T, 0);.        i
30630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
30650 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30660 72 69 74 65 28 70 54 2d 3e 70 44 62 50 61 67 65  rite(pT->pDbPage
30670 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30680 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
306a0 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 67 65      int iPg = ge
306b0 74 34 62 79 74 65 28 26 70 54 2d 3e 61 44 61 74  t4byte(&pT->aDat
306c0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[4]);.         
306d0 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20   for(/*no-op*/; 
306e0 69 50 67 3c 53 45 52 56 45 52 5f 44 45 46 41 55  iPg<SERVER_DEFAU
306f0 4c 54 5f 46 52 45 45 4c 49 53 54 5f 53 49 5a 45  LT_FREELIST_SIZE
30700 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPg++){.      
30710 20 20 20 20 20 20 69 66 28 20 2b 2b 70 42 74 2d        if( ++pBt-
30720 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
30730 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30740 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
30750 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
30760 79 74 65 28 26 70 54 2d 3e 61 44 61 74 61 5b 38  yte(&pT->aData[8
30770 2b 69 50 67 2a 34 5d 2c 20 70 42 74 2d 3e 6e 50  +iPg*4], pBt->nP
30780 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30790 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
307a0 62 79 74 65 28 26 70 54 2d 3e 61 44 61 74 61 5b  byte(&pT->aData[
307b0 34 5d 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20  4], iPg);.      
307c0 20 20 20 20 69 66 28 20 70 54 72 75 6e 6b 3d 3d      if( pTrunk==
307d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
307e0 20 70 54 72 75 6e 6b 20 3d 20 70 54 3b 0a 20 20   pTrunk = pT;.  
307f0 20 20 20 20 20 20 20 20 20 20 70 54 20 3d 20 30            pT = 0
30800 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30820 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 29 3b  releasePage(pT);
30830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30840 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30850 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
30860 61 67 65 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a  age *pLast = 0;.
30870 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
30880 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
30890 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
308a0 20 26 70 4c 61 73 74 2c 20 30 29 3b 0a 20 20 20   &pLast, 0);.   
308b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
308c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
308d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
308e0 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74  PagerWrite(pLast
308f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30900 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30910 65 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  e(pLast);.      
30920 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
30930 2b 20 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  + (u8*)pPage1->a
30940 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
30950 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
30970 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
30980 6f 64 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ode);.  if( rc==
30990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
309a0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 20   assert( pTrunk 
309b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
309c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
309d0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
309e0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
309f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
30a00 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
30a10 6b 29 3b 0a 20 20 20 20 70 54 72 75 6e 6b 20 3d  k);.    pTrunk =
30a20 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 54 72 75   0;.  }.  *ppTru
30a30 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 72  nk = pTrunk;.  r
30a40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
30a50 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
30a60 53 65 72 76 65 72 50 61 67 65 28 0a 20 20 42 74  ServerPage(.  Bt
30a70 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
30a80 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
30a90 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
30aa0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
30ab0 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
30ac0 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
30ad0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
30ae0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
30af0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
30b00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
30b10 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
30b20 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
30b30 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
30b40 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
30b50 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
30b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30b70 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
30b80 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
30b90 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
30ba0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30bd0 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  de */.  MemPage 
30be0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
30bf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
30c00 6f 64 65 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  ode page */.  Pg
30c10 6e 6f 20 70 67 6e 6f 4e 65 77 20 3d 20 30 3b 0a  no pgnoNew = 0;.
30c20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
30c30 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20  EBUG.  int nRef 
30c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
30c50 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
30c60 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  er);.#endif..  a
30c70 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
30c80 41 4c 4c 4f 43 5f 41 4e 59 20 29 3b 0a 20 20 61  ALLOC_ANY );.  a
30c90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
30ca0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
30cb0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2a 70 70 50  utex) );..  *ppP
30cc0 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  age = 0;.  rc = 
30cd0 66 69 6e 64 53 65 72 76 65 72 54 72 75 6e 6b 28  findServerTrunk(
30ce0 70 42 74 2c 20 31 2c 20 26 70 54 72 75 6e 6b 29  pBt, 1, &pTrunk)
30cf0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
30d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
30d10 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
30d20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30d30 66 20 66 72 65 65 20 70 61 67 65 73 20 6f 6e 20  f free pages on 
30d40 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
30d50 2a 2f 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 28  */.    nFree = (
30d60 69 6e 74 29 67 65 74 34 62 79 74 65 28 26 70 54  int)get4byte(&pT
30d70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
30d80 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3d 3d  .    if( nFree==
30d90 30 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  0 ){.      pgnoN
30da0 65 77 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ew = get4byte(&p
30db0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
30dc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30dd0 70 67 6e 6f 4e 65 77 20 29 3b 0a 20 20 20 20 7d  pgnoNew );.    }
30de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 46 72 65  else{.      nFre
30df0 65 2d 2d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  e--;.      pgnoN
30e00 65 77 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ew = get4byte(&p
30e10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 34  Trunk->aData[8+4
30e20 2a 6e 46 72 65 65 5d 29 3b 0a 20 20 20 20 20 20  *nFree]);.      
30e30 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
30e40 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 28 75 33 32  ->aData[4], (u32
30e50 29 6e 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72  )nFree);.      r
30e60 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
30e70 6b 29 3b 0a 20 20 20 20 20 20 70 54 72 75 6e 6b  k);.      pTrunk
30e80 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
30e90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4d 65 6d 50  E_OK ){.    MemP
30eb0 61 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  age *pNew = 0;. 
30ec0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
30ed0 54 72 75 6e 6b 20 3f 20 30 20 3a 20 50 41 47 45  Trunk ? 0 : PAGE
30ee0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3b  R_GET_NOCONTENT;
30ef0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
30f00 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
30f10 2c 20 70 67 6e 6f 4e 65 77 2c 20 26 70 4e 65 77  , pgnoNew, &pNew
30f20 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
30f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30f40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
30f50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30f60 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
30f70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30f90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30fa0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  New);.        pN
30fb0 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ew = 0;.      }.
30fc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
30fd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
30fe0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 6d  Trunk ){.      m
30ff0 65 6d 63 70 79 28 70 54 72 75 6e 6b 2d 3e 61 44  emcpy(pTrunk->aD
31000 61 74 61 2c 20 70 4e 65 77 2d 3e 61 44 61 74 61  ata, pNew->aData
31010 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
31020 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  e);.    }.    *p
31030 70 50 61 67 65 20 3d 20 70 4e 65 77 3b 0a 20 20  pPage = pNew;.  
31040 20 20 2a 70 50 67 6e 6f 20 3d 20 70 67 6e 6f 4e    *pPgno = pgnoN
31050 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61  ew;.  }..  relea
31060 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
31070 20 20 61 73 73 65 72 74 28 20 28 72 63 3d 3d 53    assert( (rc==S
31080 51 4c 49 54 45 5f 4f 4b 29 3d 3d 28 2a 70 70 50  QLITE_OK)==(*ppP
31090 61 67 65 21 3d 30 29 20 29 3b 0a 20 20 61 73 73  age!=0) );.  ass
310a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
310b0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
310c0 50 61 67 65 72 29 3d 3d 28 6e 52 65 66 2b 28 2a  Pager)==(nRef+(*
310d0 70 70 50 61 67 65 21 3d 30 29 29 20 29 3b 0a 20  ppPage!=0)) );. 
310e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
310f0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 65  tatic int freeSe
31100 72 76 65 72 50 61 67 65 32 28 42 74 53 68 61 72  rverPage2(BtShar
31110 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
31120 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 50   *pPage, Pgno iP
31130 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  age){.  int rc; 
31140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31150 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
31160 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 50  n code */.  MemP
31170 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
31180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31190 68 65 20 6e 6f 64 65 20 70 61 67 65 20 2a 2f 0a  he node page */.
311a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
311b0 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d  BUG.  int nRef =
311c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
311d0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
311e0 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  r);.#endif..  as
311f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
31200 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
31210 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 66  tex) );.  rc = f
31220 69 6e 64 53 65 72 76 65 72 54 72 75 6e 6b 28 70  indServerTrunk(p
31230 42 74 2c 20 30 2c 20 26 70 54 72 75 6e 6b 29 3b  Bt, 0, &pTrunk);
31240 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
31250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
31260 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
31270 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31280 20 66 72 65 65 20 70 61 67 65 73 20 6f 6e 20 74   free pages on t
31290 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  his trunk page *
312a0 2f 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 28 69  /.    nFree = (i
312b0 6e 74 29 67 65 74 34 62 79 74 65 28 26 70 54 72  nt)get4byte(&pTr
312c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
312d0 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 28      if( nFree>=(
312e0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
312f0 20 2f 20 34 29 20 2d 20 32 29 20 29 7b 0a 20 20   / 4) - 2) ){.  
31300 20 20 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30      if( pPage==0
31310 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
31320 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
31330 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
31340 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  &pPage, 0);.    
31350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31360 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
31370 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31390 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
313a0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
313b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
313c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
313d0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
313e0 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  y(pPage->aData, 
313f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 2c 20 70  pTrunk->aData, p
31400 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
31410 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
31420 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
31430 5b 30 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  [0], iPage);.   
31440 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
31450 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
31460 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
31470 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31480 50 61 67 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Page);.    }else
31490 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
314a0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
314b0 38 2b 6e 46 72 65 65 2a 34 5d 2c 20 69 50 61 67  8+nFree*4], iPag
314c0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
314d0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
314e0 61 5b 34 5d 2c 20 28 75 33 32 29 6e 46 72 65 65  a[4], (u32)nFree
314f0 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  +1);.    }.    r
31500 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
31510 6b 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  k);.  }..  asser
31520 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33  t( nRef==sqlite3
31530 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
31540 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20  t->pPager) );.  
31550 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
31560 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 6c 6c  lse.# define all
31570 6f 63 61 74 65 53 65 72 76 65 72 50 61 67 65 28  ocateServerPage(
31580 76 2c 20 77 2c 20 78 2c 20 79 2c 20 7a 29 20 53  v, w, x, y, z) S
31590 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
315a0 65 20 66 72 65 65 53 65 72 76 65 72 50 61 67 65  e freeServerPage
315b0 32 28 78 2c 20 79 2c 20 7a 29 20 53 51 4c 49 54  2(x, y, z) SQLIT
315c0 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  E_OK.#endif /* S
315d0 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49  QLITE_SERVER_EDI
315e0 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  TION */../*.** A
315f0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
31600 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
31610 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
31620 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
31630 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
31640 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
31650 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
31660 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
31670 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
31680 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
31690 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
316a0 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
316b0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
316c0 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
316d0 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
316e0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
316f0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
31700 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
31710 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
31720 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
31730 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
31740 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
31750 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
31760 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
31770 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
31780 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74    *ppPage is set
31790 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20   to NULL in the 
317a0 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
317b0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
317c0 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
317d0 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
317e0 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  n an effort is m
317f0 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
31800 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
31810 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
31820 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
31830 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
31840 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
31850 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
31860 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
31870 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
31880 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
31890 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
318a0 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
318b0 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
318c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d  .**.** If the eM
318d0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
318e0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61   BTALLOC_EXACT a
318f0 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61  nd the nearby pa
31900 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79  ge exists.** any
31910 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
31920 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
31930 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
31940 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49   be returned.  I
31950 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54  f.** eMode is BT
31960 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68  ALLOC_LT then th
31970 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20  e page returned 
31980 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61  will be less tha
31990 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
319a0 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73   nearby if any s
319b0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e  uch page exists.
319c0 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54    If eMode is BT
319d0 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74  ALLOC_ANY then t
319e0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72  here.** are no r
319f0 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77  estrictions on w
31a00 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74  hich page is ret
31a10 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
31a20 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
31a30 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
31a40 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
31a50 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
31a60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
31a70 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
31a80 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
31a90 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
31aa0 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
31ab0 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
31ac0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
31ad0 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
31ae0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
31af0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
31b00 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
31b10 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
31b20 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
31b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
31b40 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
31b50 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
31b60 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
31b70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
31b80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
31b90 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
31ba0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
31bb0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
31bc0 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
31bd0 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
31be0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
31bf0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
31c00 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
31c10 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
31c20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
31c30 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
31c40 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
31c50 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
31c60 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 69 66 28  e file */..  if(
31c70 20 62 74 72 65 65 46 72 65 65 6c 69 73 74 46 6f   btreeFreelistFo
31c80 72 6d 61 74 32 28 70 42 74 29 20 29 7b 0a 20 20  rmat2(pBt) ){.  
31c90 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74    return allocat
31ca0 65 53 65 72 76 65 72 50 61 67 65 28 70 42 74 2c  eServerPage(pBt,
31cb0 20 70 70 50 61 67 65 2c 20 70 50 67 6e 6f 2c 20   ppPage, pPgno, 
31cc0 6e 65 61 72 62 79 2c 20 65 4d 6f 64 65 29 3b 20  nearby, eMode); 
31cd0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
31ce0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31cf0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
31d00 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
31d10 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
31d20 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
31d30 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
31d40 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
31d50 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
31d60 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
31d70 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
31d80 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
31d90 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
31da0 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
31db0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
31dc0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
31dd0 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
31de0 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
31df0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
31e00 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
31e10 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
31e20 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31e30 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
31e40 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
31e50 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
31e60 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
31e70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31e80 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
31e90 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
31ea0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
31eb0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
31ec0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
31ed0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
31ee0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
31ef0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
31f00 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
31f10 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
31f20 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
31f30 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
31f40 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
31f50 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
31f60 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
31f70 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
31f80 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
31f90 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
31fa0 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
31fb0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31fc0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
31fd0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
31fe0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
31ff0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
32000 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
32010 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
32020 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
32030 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
32040 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
32050 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32060 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
32070 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
32080 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
32090 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
320a0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
320b0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
320c0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
320d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
320e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
320f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32100 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
32110 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
32120 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
32130 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
32140 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
32150 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
32160 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
32170 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
32180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32190 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
321a0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
321b0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
321c0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
321d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
321e0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
321f0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
32200 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
32210 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
32220 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
32230 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
32240 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
32250 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
32260 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
32270 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32280 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
32290 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
322a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
322b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
322c0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
322d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
322e0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
322f0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
32300 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
32310 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
32320 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
32330 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
32340 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
32350 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
32360 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
32370 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
32380 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
32390 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
323a0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
323b0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
323c0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
323d0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
323e0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
323f0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
32400 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
32410 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
32420 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
32430 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
32440 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
32450 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
32460 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
32470 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
32480 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32490 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
324a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
324b0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
324c0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
324d0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
324e0 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
324f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
32500 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
32510 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
32520 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
32530 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
32540 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
32550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32560 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
32570 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
32580 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
32590 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
325a0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
325b0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
325c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
325d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
325e0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
325f0 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
32600 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
32610 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
32620 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
32630 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
32640 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
32650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
32660 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
32670 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
32680 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
32690 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
326a0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
326b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
326c0 5f 50 47 4e 4f 28 70 50 72 65 76 54 72 75 6e 6b  _PGNO(pPrevTrunk
326d0 20 3f 20 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70   ? pPrevTrunk->p
326e0 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20 20 20 20  gno : 1);.      
326f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
32700 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
32710 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  edPage(pBt, iTru
32720 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
32730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32740 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
32750 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
32760 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32770 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32780 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
32790 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
327a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
327b0 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
327c0 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
327d0 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d  NCE-OF: R-13523-
327e0 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64  04394 The second
327f0 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
32800 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32810 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  e.      ** is th
32820 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
32830 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74   page pointers t
32840 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20  o follow. */.   
32850 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
32860 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
32870 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
32880 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
32890 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
328a0 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
328b0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
328c0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
328d0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
328e0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
328f0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
32900 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
32910 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
32920 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
32930 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
32940 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
32950 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
32960 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32970 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32980 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
32990 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
329a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
329b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
329c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
329d0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
329e0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
329f0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
32a00 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
32a10 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
32a20 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
32a30 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
32a40 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
32a50 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
32a60 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
32a70 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
32a80 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
32a90 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
32aa0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
32ab0 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
32ac0 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
32ad0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
32ae0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
32af0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
32b00 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
32b10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32b20 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
32b30 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  unk);.        go
32b40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32b50 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
32b60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
32b70 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
32b80 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
32b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
32ba0 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20  (nearby==iTrunk 
32bb0 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62  || (iTrunk<nearb
32bc0 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
32bd0 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
32be0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
32bf0 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
32c00 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
32c10 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
32c20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
32c30 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
32c40 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
32c50 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
32c60 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
32c70 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
32c80 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
32c90 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
32ca0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
32cb0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
32cc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32cd0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
32ce0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
32cf0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
32d00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32d10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32d20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32d30 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
32d40 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
32d50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
32d60 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32d70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
32d80 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
32d90 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
32da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32db0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32dc0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
32dd0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
32de0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
32df0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32e00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
32e10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32e20 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32e40 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
32e50 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
32e60 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
32e70 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
32e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
32e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
32ea0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
32eb0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
32ec0 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
32ed0 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
32ee0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
32ef0 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
32f00 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
32f10 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
32f20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
32f30 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
32f40 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
32f50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
32f60 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
32f70 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
32f80 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
32f90 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
32fa0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
32fb0 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
32fc0 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
32fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
32fe0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
32ff0 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (iTrunk);.      
33000 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
33010 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
33020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
33040 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
33050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
33060 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
33070 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
33080 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
33090 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
330a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
330b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
330c0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
330d0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
330e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
330f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33100 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
33110 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
33120 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33140 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
33150 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
33160 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
33170 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
33180 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33190 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
331a0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
331b0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
331c0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
331d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
331e0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
331f0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
33200 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
33210 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
33220 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
33230 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
33240 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
33250 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
33260 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
33270 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
33280 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
33290 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
332a0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
332b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
332c0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
332d0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
332e0 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
332f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
33300 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
33310 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33320 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
33330 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
33340 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
33350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
33360 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
33370 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
33380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33390 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
333a0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
333b0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
333c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
333d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
333e0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
333f0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
33400 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
33410 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
33420 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
33430 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
33440 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
33450 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
33460 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
33470 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
33480 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
33490 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
334a0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
334b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
334c0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
334d0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
334e0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
334f0 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
33500 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
33510 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
33520 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
33530 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
33540 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
33550 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
33560 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
33570 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
33580 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
33590 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
335a0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
335b0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
335c0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
335d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
335e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
335f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33600 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33610 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
33620 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
33630 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
33640 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
33650 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
33660 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
33670 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
33680 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
33690 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
336a0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
336b0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
336c0 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
336d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
336e0 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
336f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
33700 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
33710 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
33720 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
33730 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
33740 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
33750 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33760 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
33770 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
33780 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
33790 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
337a0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
337b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
337c0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
337d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
337e0 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
337f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33800 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
33810 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
33820 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
33830 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
33840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
33850 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
33860 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
33870 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
33880 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
33890 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
338a0 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
338b0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
338c0 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
338d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
338e0 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
338f0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
33900 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
33910 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
33920 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
33930 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
33940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33950 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
33960 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
33970 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
33980 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
33990 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
339a0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
339b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
339c0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
339d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
339e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
339f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
33a00 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
33a10 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
33a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
33a30 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
33a40 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
33a50 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
33a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33a70 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
33a80 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
33a90 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
33aa0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
33ab0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
33ac0 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
33ad0 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
33ae0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
33af0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
33b00 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
33b10 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
33b20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
33b50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33b60 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
33b70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
33b80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33ba0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
33bb0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
33bc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50              *ppP
33bd0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
33be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33bf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
33c00 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
33c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33c20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
33c30 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
33c40 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
33c50 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
33c60 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
33c70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
33c80 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
33c90 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
33ca0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
33cb0 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
33cc0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
33cd0 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
33ce0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
33cf0 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
33d00 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
33d10 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
33d20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
33d30 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
33d40 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
33d50 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
33d60 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
33d70 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
33d80 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
33d90 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
33da0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
33db0 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
33dc0 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
33dd0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
33de0 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
33df0 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
33e00 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
33e10 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
33e20 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
33e30 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
33e40 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
33e50 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
33e60 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
33e70 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
33e80 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
33e90 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
33ea0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
33eb0 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
33ec0 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
33ed0 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
33ee0 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
33ef0 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
33f00 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
33f10 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
33f20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
33f30 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
33f40 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
33f50 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
33f60 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
33f70 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
33f80 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
33f90 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
33fa0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
33fb0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
33fc0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
33fd0 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
33fe0 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
33ff0 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
34000 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
34010 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
34020 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
34030 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
34040 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
34050 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
34060 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
34070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34080 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
34090 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
340a0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
340b0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
340c0 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ))? PAGER_GET_NO
340d0 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20  CONTENT:0;..    
340e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
340f0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
34100 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
34110 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34120 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
34130 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
34140 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
34150 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
34160 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
34170 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
34180 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
34190 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
341a0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
341b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
341c0 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
341d0 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
341e0 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
341f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
34200 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
34210 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
34220 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
34230 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
34240 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
34250 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
34260 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
34270 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
34280 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
34290 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
342a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
342b0 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
342c0 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
342d0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
342e0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
342f0 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
34300 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
34310 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
34320 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
34330 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
34340 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
34350 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
34360 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
34370 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
34380 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
34390 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
343a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
343b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
343c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
343d0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
343e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
343f0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
34400 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
34410 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
34420 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
34430 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
34440 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
34450 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
34460 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
34470 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
34480 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
34490 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
344a0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
344b0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
344c0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
344d0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
344e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
344f0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
34500 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
34510 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
34520 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
34530 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
34540 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34560 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
34570 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
34580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
345a0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
345b0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
345c0 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
345d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
345e0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
345f0 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
34600 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
34610 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
34620 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
34630 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
34640 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
34650 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
34660 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
34670 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61  pPrevTrunk);.  a
34680 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34690 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
346a0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
346b0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
346c0 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73  age)<=1 );.  ass
346d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
346e0 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  OK || (*ppPage)-
346f0 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
34700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34710 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
34720 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
34730 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
34740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34750 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
34760 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
34770 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
34780 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
34790 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
347a0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
347b0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
347c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
347d0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
347e0 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
347f0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
34800 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
34810 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
34820 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
34830 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
34840 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
34850 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
34860 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
34870 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
34880 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
34890 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
348a0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
348b0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
348c0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
348d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
348e0 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
348f0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
34900 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
34910 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
34920 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
34930 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
34940 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
34950 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
34960 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
34970 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
34980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
34990 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
349a0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
349b0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
349c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
349d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
349e0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
349f0 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
34a00 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
34a10 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
34a20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
34a30 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
34a40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
34a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a60 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
34a70 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
34a80 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
34a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34ab0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
34ac0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
34ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ae0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
34af0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
34b00 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
34b10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
34b20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
34b30 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
34b40 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
34b50 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b  DB || iPage>1 );
34b60 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
34b70 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
34b80 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
34b90 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20  ..  if( iPage<2 
34ba0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
34bb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34bc0 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
34bd0 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
34be0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
34bf0 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
34c00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
34c10 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
34c20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
34c30 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
34c40 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
34c50 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
34c60 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
34c70 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
34c80 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
34c90 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
34ca0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
34cb0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
34cc0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
34cd0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
34ce0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
34cf0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
34d00 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
34d10 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
34d20 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
34d30 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
34d40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34d50 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
34d60 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
34d70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
34d80 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
34d90 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
34da0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
34db0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
34dc0 7a 65 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ze);.  }.  .  if
34dd0 28 20 62 74 72 65 65 46 72 65 65 6c 69 73 74 46  ( btreeFreelistF
34de0 6f 72 6d 61 74 32 28 70 42 74 29 20 29 7b 0a 20  ormat2(pBt) ){. 
34df0 20 20 20 72 63 20 3d 20 66 72 65 65 53 65 72 76     rc = freeServ
34e00 65 72 50 61 67 65 32 28 70 42 74 2c 20 70 50 61  erPage2(pBt, pPa
34e10 67 65 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  ge, iPage);.    
34e20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34e30 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  t;.  }..  /* Inc
34e40 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
34e50 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
34e60 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
34e70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34e80 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
34e90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
34ea0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34eb0 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
34ec0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
34ed0 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
34ee0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
34ef0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
34f00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
34f10 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
34f20 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
34f30 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
34f40 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
34f50 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
34f60 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
34f70 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
34f80 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
34f90 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
34fa0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
34fb0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
34fc0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
34fd0 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
34fe0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
34ff0 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
35000 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
35010 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
35020 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
35030 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
35040 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
35050 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
35060 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
35070 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
35080 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
35090 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
350a0 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
350b0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
350c0 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
350d0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
350e0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
350f0 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
35100 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
35110 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
35120 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
35130 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
35140 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
35150 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
35160 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
35170 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
35180 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
35190 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
351a0 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
351b0 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
351c0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
351d0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
351e0 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
351f0 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
35200 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
35210 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
35220 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
35230 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
35240 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
35250 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
35260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35270 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
35280 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
35290 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
352a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
352b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
352c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
352d0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
352e0 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
352f0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
35300 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35310 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35320 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
35330 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
35340 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
35350 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
35360 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
35370 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
35380 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
35390 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
353a0 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
353b0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
353c0 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
353d0 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
353e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
353f0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
35400 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
35410 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
35420 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
35430 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
35440 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
35450 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
35460 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
35470 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
35480 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
35490 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
354a0 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
354b0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
354c0 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
354d0 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
354e0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
354f0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
35500 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
35510 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
35520 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
35530 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
35540 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
35550 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
35560 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
35570 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
35580 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
35590 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
355a0 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
355b0 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
355c0 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
355d0 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
355e0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
355f0 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
35600 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
35610 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
35620 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
35630 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
35640 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
35650 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
35660 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
35670 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
35680 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
35690 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
356a0 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
356b0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
356c0 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  "..      **.    
356d0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
356e0 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20  : R-19920-11576 
356f0 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76  However, newer v
35700 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
35710 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  e still.      **
35720 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65   avoid using the
35730 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65   last six entrie
35740 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s in the freelis
35750 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72  t trunk page arr
35760 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ay in.      ** o
35770 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61  rder that databa
35780 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
35790 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
357a0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e  ns of SQLite can
357b0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   be.      ** rea
357c0 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
357d0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20  ons of SQLite.. 
357e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
357f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35800 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
35810 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
35820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35830 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
35840 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
35850 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
35860 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
35870 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
35880 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
35890 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
358a0 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62  pPage && (pBt->b
358b0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
358c0 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  CURE_DELETE)==0 
358d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
358e0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
358f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
35900 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
35910 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
35920 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
35930 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
35940 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
35950 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
35960 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
35970 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
35980 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
35990 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
359a0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
359b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
359c0 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
359d0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
359e0 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
359f0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
35a00 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
35a10 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
35a20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
35a30 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
35a40 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
35a50 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
35a60 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
35a70 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
35a80 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
35a90 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
35aa0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
35ab0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
35ac0 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
35ad0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
35ae0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
35af0 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
35b00 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
35b10 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
35b20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
35b30 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
35b40 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
35b50 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
35b60 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
35b70 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
35b80 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
35b90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35ba0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
35bb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
35bc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
35bd0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
35be0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
35bf0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
35c00 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
35c10 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
35c20 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
35c30 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35c40 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
35c50 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
35c60 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
35c70 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
35c80 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
35c90 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
35ca0 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
35cb0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
35cc0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
35cd0 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
35ce0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
35cf0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
35d00 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
35d10 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
35d20 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
35d30 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
35d40 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
35d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35d60 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
35d70 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
35d80 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
35d90 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
35da0 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
35db0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
35dc0 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
35dd0 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20  en Cell.  Write 
35de0 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c  the.** local Cel
35df0 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62  l size (the numb
35e00 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74  er of bytes on t
35e10 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
35e20 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76  , omitting.** ov
35e30 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e  erflow) into *pn
35e40 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
35e50 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20  int clearCell(. 
35e60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
35e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
35e80 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
35e90 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a  ins the Cell */.
35ea0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
35eb0 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69  *pCell,    /* Fi
35ec0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
35ed0 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  Cell */.  CellIn
35ee0 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
35ef0 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72     /* Size infor
35f00 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
35f10 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74   cell */.){.  Bt
35f20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
35f30 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
35f40 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
35f50 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
35f60 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
35f70 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
35f80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
35f90 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
35fa0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
35fb0 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
35fc0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
35fd0 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d  o);.  if( pInfo-
35fe0 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e  >nLocal==pInfo->
35ff0 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
36000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36010 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
36020 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
36030 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
36040 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
36050 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d  if( pCell+pInfo-
36060 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65  >nSize-1 > pPage
36070 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
36080 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  askPage ){.    /
36090 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
360a0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
360b0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
360c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
360d0 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
360e0 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
360f0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20   get4byte(pCell 
36100 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d  + pInfo->nSize -
36110 20 34 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   4);.  assert( p
36120 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
36130 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
36140 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
36150 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
36160 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50  vfl = (pInfo->nP
36170 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e  ayload - pInfo->
36180 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
36190 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
361a0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
361b0 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20  t( nOvfl>0 || . 
361c0 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26     (CORRUPT_DB &
361d0 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  & (pInfo->nPaylo
361e0 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  ad + ovflPageSiz
361f0 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29  e)<ovflPageSize)
36200 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  .  );.  while( n
36210 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
36220 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
36230 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
36240 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
36250 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
36260 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
36270 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
36280 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
36290 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
362a0 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
362b0 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
362c0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
362d0 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
362e0 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
362f0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
36300 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
36310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
36320 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
36330 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
36340 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
36350 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
36360 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
36370 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
36380 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
36390 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
363a0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
363b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
363c0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
363d0 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
363e0 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
363f0 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
36400 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
36410 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
36420 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
36430 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
36440 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
36450 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
36460 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
36470 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
36480 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
36490 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
364a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
364b0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
364c0 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
364d0 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
364e0 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
364f0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
36500 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
36510 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
36520 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
36530 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
36540 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
36550 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
36560 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
36570 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
36580 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
36590 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
365a0 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
365b0 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
365c0 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
365d0 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
365e0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
365f0 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
36600 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
36610 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
36620 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
36630 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
36640 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
36650 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
36660 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
36670 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
36680 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
36690 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
366a0 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
366b0 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
366c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
366d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
366e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
366f0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
36700 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
36710 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
36720 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
36730 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
36740 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
36750 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
36760 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
36770 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
36780 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
36790 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
367a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
367b0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
367c0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
367d0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
367e0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
367f0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
36800 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
36810 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
36820 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
36830 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
36840 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
36850 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
36860 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
36870 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
36880 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
36890 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
368a0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
368b0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
368c0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
368d0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
368e0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
368f0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
36900 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
36910 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
36920 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
36930 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
36940 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
36950 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
36960 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
36970 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
36980 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
36990 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
369a0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
369b0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
369c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
369d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
369e0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
369f0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
36a00 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
36a10 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
36a20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
36a30 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
36a40 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
36a50 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70   BtreePayload *p
36a60 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79  X,        /* Pay
36a70 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20  load with which 
36a80 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
36a90 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a   cell */.  int *
36aa0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
36ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
36ac0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
36ad0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
36ae0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
36af0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
36b00 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
36b10 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
36b20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
36b30 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
36b40 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
36b50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
36b60 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
36b70 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
36b80 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
36b90 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
36ba0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
36bb0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
36bc0 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
36bd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
36be0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
36bf0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
36c00 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
36c10 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
36c20 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
36c30 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
36c40 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
36c50 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
36c60 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
36c70 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
36c80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
36c90 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
36ca0 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
36cb0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
36cc0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
36cd0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
36ce0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36cf0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
36d00 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
36d10 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
36d20 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e  Header = pPage->
36d30 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
36d40 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
36d50 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  y ){.    nPayloa
36d60 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20  d = pX->nData + 
36d70 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70  pX->nZero;.    p
36d80 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b  Src = pX->pData;
36d90 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e  .    nSrc = pX->
36da0 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  nData;.    asser
36db0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
36dc0 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49  Leaf ); /* fillI
36dd0 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c  nCell() only cal
36de0 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a  led for leaves *
36df0 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  /.    nHeader +=
36e00 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
36e10 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
36e20 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65  ayload);.    nHe
36e30 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
36e40 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
36e50 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e  ], *(u64*)&pX->n
36e60 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
36e70 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e     assert( pX->n
36e80 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20  Key<=0x7fffffff 
36e90 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29  && pX->pKey!=0 )
36ea0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61  ;.    nSrc = nPa
36eb0 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d  yload = (int)pX-
36ec0 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  >nKey;.    pSrc 
36ed0 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20  = pX->pKey;.    
36ee0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
36ef0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
36f00 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
36f10 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  );.  }.  .  /* F
36f20 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
36f30 61 64 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79  ad */.  if( nPay
36f40 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
36f50 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d  Local ){.    n =
36f60 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c   nHeader + nPayl
36f70 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73  oad;.    testcas
36f80 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74  e( n==3 );.    t
36f90 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b  estcase( n==4 );
36fa0 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e  .    if( n<4 ) n
36fb0 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = 4;.    *pnSiz
36fc0 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65  e = n;.    space
36fd0 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Left = nPayload;
36fe0 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43  .    pPrior = pC
36ff0 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ell;.  }else{.  
37000 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65    int mn = pPage
37010 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
37020 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f  n = mn + (nPaylo
37030 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67  ad - mn) % (pPag
37040 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
37050 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
37060 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
37070 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
37080 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
37090 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
370a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70  );.    if( n > p
370b0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
370c0 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61   n = mn;.    spa
370d0 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20  ceLeft = n;.    
370e0 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48  *pnSize = n + nH
370f0 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70  eader + 4;.    p
37100 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e  Prior = &pCell[n
37110 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20  Header+n];.  }. 
37120 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
37130 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20  ll[nHeader];..  
37140 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
37150 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c   variables shoul
37160 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c  d be set as foll
37170 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
37180 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   nPayload       
37190 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61      Total payloa
371a0 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  d size in bytes.
371b0 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20    **   pPayload 
371c0 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
371d0 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20  writing payload 
371e0 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63  here.  **   spac
371f0 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53  eLeft          S
37200 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
37210 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20  t pPayload.  If 
37220 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65  nPayload>spaceLe
37230 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ft,.  **        
37240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
37250 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74  at means content
37260 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f   must spill into
37270 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
37280 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20  .  **   *pnSize 
37290 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
372a0 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  of the local cel
372b0 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  l (not counting 
372c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a  overflow pages).
372d0 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20    **   pPrior   
372e0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
372f0 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e  to write the pgn
37300 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  o of the first o
37310 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a  verflow page.  *
37320 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c  *.  ** Use a cal
37330 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  l to btreeParseC
37340 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69  ellPtr() to veri
37350 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  fy that the valu
37360 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65  es above.  ** we
37370 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72  re computed corr
37380 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64  ectly..  */.#ifd
37390 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
373a0 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
373b0 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65   info;.    pPage
373c0 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
373d0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
373e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
373f0 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e  Header==(int)(in
37400 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
37410 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
37420 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70  rt( info.nKey==p
37430 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  X->nKey );.    a
37440 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
37450 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
37460 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
37470 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
37480 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ocal );.  }.#end
37490 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
374a0 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
374b0 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
374c0 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
374d0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
374e0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61   */.  while( nPa
374f0 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
37500 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
37510 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
37520 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
37530 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
37540 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
37550 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
37560 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
37570 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
37580 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
37590 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
375a0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
375b0 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
375c0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
375d0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
375e0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
375f0 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
37600 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
37610 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
37620 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
37630 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
37640 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
37650 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
37660 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
37670 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
37680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
37690 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
376a0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
376b0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
376c0 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
376d0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
376e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
376f0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
37700 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
37710 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
37720 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
37730 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
37740 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
37750 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
37760 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
37770 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
37780 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
37790 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
377a0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
377b0 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
377c0 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
377d0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
377e0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
377f0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
37800 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
37810 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
37820 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
37830 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
37840 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
37850 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
37860 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
37870 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
37880 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
37890 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
378a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
378b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
378c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
378d0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
378e0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
378f0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
37900 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
37910 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
37920 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
37930 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
37940 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
37950 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
37960 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
37970 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
37980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
37990 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
379a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
379b0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
379c0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
379d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
379e0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
379f0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
37a00 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
37a10 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
37a20 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
37a30 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
37a40 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
37a50 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
37a60 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
37a70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37a80 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
37a90 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
37aa0 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
37ab0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
37ac0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
37ad0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
37ae0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
37af0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
37b00 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
37b10 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
37b20 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
37b30 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
37b40 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
37b50 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
37b60 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
37b70 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
37b80 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
37b90 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
37ba0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
37bb0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
37bc0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
37bd0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
37be0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
37bf0 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
37c00 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
37c10 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
37c20 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
37c30 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
37c40 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
37c50 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
37c60 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
37c70 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
37c80 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
37c90 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
37ca0 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
37cb0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
37cc0 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
37cd0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
37ce0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
37cf0 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
37d00 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
37d10 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
37d20 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
37d30 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
37d40 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
37d50 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
37d60 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
37d70 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
37d80 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
37d90 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
37da0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
37db0 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
37dc0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
37dd0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
37de0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
37df0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
37e00 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
37e10 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
37e20 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
37e30 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
37e40 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
37e50 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
37e60 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
37e70 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37e80 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
37e90 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
37ea0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
37eb0 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
37ec0 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
37ed0 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
37ee0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
37ef0 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
37f00 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
37f10 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
37f20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
37f30 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
37f40 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
37f50 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
37f60 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
37f70 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
37f80 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
37f90 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
37fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37fb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
37fc0 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
37fd0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
37fe0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
37ff0 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
38000 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
38010 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
38020 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
38030 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
38040 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
38050 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
38060 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
38070 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
38080 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
38090 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
380a0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
380b0 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
380c0 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
380d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
380e0 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
380f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
38100 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
38110 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
38120 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
38130 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20  RC){.  u32 pc;  
38140 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
38150 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
38160 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
38170 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
38180 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
38190 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
381a0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
381b0 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
381c0 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
381d0 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
381e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
381f0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
38200 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
38210 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
38220 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
38230 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
38240 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
38250 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
38260 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
38270 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
38280 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
38290 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
382a0 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c  PT_DB || sz==cel
382b0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
382c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
382d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
382e0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
382f0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
38300 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
38310 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
38320 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
38330 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
38340 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
38350 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
38360 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
38370 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
38380 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
38390 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
383a0 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
383b0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
383c0 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
383d0 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
383e0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
383f0 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
38400 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
38410 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
38420 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
38430 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
38440 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
38450 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;