/ Hex Artifact Content
Login

Artifact 00579ff9c2831d6f98cc993f8f2a34c0ff996e89b3cd2f27928f75796bc3a58a:


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 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3a70: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3a80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3a90: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3aa0: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
3ab0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
3ac0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
3ad0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
3ae0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
3af0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
3b00: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3b10: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3b20: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3b30: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3b40: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3b50: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3b60: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3b70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3b80: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3b90: 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  }../* Verify tha
3ba0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  t the cursor and
3bb0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 61 67   the BtShared ag
3bc0: 72 65 65 20 61 62 6f 75 74 20 77 68 61 74 20 69  ree about what i
3bd0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  s the current.**
3be0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74   database connet
3bf0: 69 6f 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70  ion. This is imp
3c00: 6f 72 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64  ortant in shared
3c10: 2d 63 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20  -cache mode. If 
3c20: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
3c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
3c40: 74 65 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d  ters get out-of-
3c50: 73 79 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73  sync, it is poss
3c60: 69 62 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65  ible for routine
3c70: 73 20 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49  s like.** btreeI
3c80: 6e 69 74 50 61 67 65 28 29 20 74 6f 20 72 65 66  nitPage() to ref
3c90: 65 72 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20  erence an stale 
3ca0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3cb0: 65 72 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  er that referenc
3cc0: 65 73 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63  es a.** a connec
3cd0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c  tion that has al
3ce0: 72 65 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54  ready closed.  T
3cf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3d00: 73 65 64 20 69 6e 73 69 64 65 20 61 73 73 65 72  sed inside asser
3d10: 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
3d20: 73 20 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74  s only and for t
3d30: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f  he purpose of do
3d40: 75 62 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68  uble-checking th
3d50: 61 74 20 74 68 65 20 62 74 72 65 65 20 63 6f 64  at the btree cod
3d60: 65 0a 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74  e.** does keep t
3d70: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
3d80: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  ection pointers 
3d90: 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73  up-to-date..*/.s
3da0: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
3db0: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43  OwnsBtShared(BtC
3dc0: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
3dd0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
3de0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65  Mutex(p) );.  re
3df0: 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d  turn (p->pBtree-
3e00: 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29  >db==p->pBt->db)
3e10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3e20: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3e30: 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20   overflow cache 
3e40: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61  of the cursor pa
3e50: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f  t argument..** o
3e70: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3e80: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3e90: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76  ..*/.#define inv
3ea0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3eb0: 61 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72  ache(pCur) (pCur
3ec0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
3ed0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a  TCF_ValidOvfl)..
3ee0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ef0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3f00: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3f10: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
3f20: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
3f30: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
3f40: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
3f50: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
3f60: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3f70: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
3f80: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
3f90: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
3fa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3fb0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3fc0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
3fd0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
3fe0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
3ff0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
4000: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  e(p);.  }.}..#if
4010: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4020: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
4030: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4040: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
4050: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
4060: 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65  tents of a table
4070: 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  .** to invalidat
4080: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
4090: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
40a0: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
40b0: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
40c0: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
40d0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  fied..**.** If a
40e0: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
40f0: 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68  able is true, th
4100: 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  en the entire co
4110: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
4120: 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20   table is about 
4130: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49  to be deleted. I
4140: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4150: 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62  lidate all incrb
4160: 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  lob.** cursors o
4170: 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77  pen on any row w
4180: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ithin the table 
4190: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70  with root-page p
41a0: 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f  gnoRoot..**.** O
41b0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67  therwise, if arg
41c0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
41d0: 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  le is false, the
41e0: 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a  n the row with.*
41f0: 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20  * rowid iRow is 
4200: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f  being replaced o
4210: 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  r deleted. In th
4220: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4230: 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65  te.** only those
4240: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
4250: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73  s open on that s
4260: 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a  pecific row..*/.
4270: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
4280: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4290: 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a  rsors(.  Btree *
42a0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
42b0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
42c0: 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
42d0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  /.  Pgno pgnoRoo
42e0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
42f0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69  he table that mi
4300: 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20  ght be changing 
4310: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4330: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
4340: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
4350: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
4360: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
4370: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
4380: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4390: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
43a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  rsor *p;.  if( p
43b0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
43c0: 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72  obCur==0 ) retur
43d0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
43e0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
43f0: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4400: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
4410: 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66  blobCur = 0;.  f
4420: 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
4430: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
4440: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
4450: 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  f( (p->curFlags 
4460: 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29  & BTCF_Incrblob)
4470: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
4480: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4490: 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Cur = 1;.      i
44a0: 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
44b0: 70 67 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43  pgnoRoot && (isC
44c0: 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e  learTable || p->
44d0: 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29  info.nKey==iRow)
44e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44f0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
4500: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
4510: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
4520: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
4530: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
4540: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4550: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4560: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4570: 72 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23  rsors(w,x,y,z).#
4580: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4590: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
45a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
45b0: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
45c0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
45d0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
45e0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
45f0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
4600: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
4610: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
4620: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4630: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4640: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4650: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4660: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4670: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4680: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4690: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
46a0: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
46b0: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
46c0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
46d0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
46e0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
46f0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
4700: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
4710: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
4720: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4730: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4740: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4750: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4760: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4770: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4780: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4790: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
47a0: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
47b0: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
47c0: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
47d0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
47e0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
47f0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
4800: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
4810: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
4820: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4830: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4840: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4850: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4860: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4870: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4880: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4890: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
48a0: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
48b0: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
48c0: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
48d0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
48e0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
48f0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
4900: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
4910: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
4920: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4930: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4940: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4950: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4960: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4970: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4980: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4990: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
49a0: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
49b0: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
49c0: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
49d0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
49e0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
49f0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
4a00: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
4a10: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4a20: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4a30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4a40: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4a50: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4a60: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4a70: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4a80: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4a90: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4aa0: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4ab0: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4ac0: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
4ad0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
4ae0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
4af0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
4b00: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
4b10: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
4b20: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4b30: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4b40: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4b50: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4b60: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4b70: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4b80: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4b90: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4ba0: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4bb0: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4bc0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4bd0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
4be0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
4bf0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
4c00: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
4c10: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
4c20: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4c30: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4c40: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4c50: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4c60: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4c70: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4c80: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4c90: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4ca0: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4cb0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4cc0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
4cd0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4ce0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
4cf0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4d00: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
4d10: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
4d20: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4d30: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4d40: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4d50: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4d60: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4d70: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4d80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
4d90: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  T;.    }.  }.  i
4da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4db0: 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65   && pgno<=sqlite
4dc0: 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d  3BitvecSize(pBt-
4dd0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b  >pHasContent) ){
4de0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4df0: 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e  3BitvecSet(pBt->
4e00: 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e  pHasContent, pgn
4e10: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
4e20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75   rc;.}../*.** Qu
4e30: 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64  ery the BtShared
4e40: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63  .pHasContent vec
4e50: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tor..**.** This 
4e60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4e70: 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c  ed when a free-l
4e80: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
4e90: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
4ea0: 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66  e.** free-list f
4eb0: 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74  or reuse. It ret
4ec0: 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74  urns false if it
4ed0: 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72   is safe to retr
4ee0: 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ieve the.** page
4ef0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
4f00: 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
4f10: 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
4f20: 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72   set. True other
4f30: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
4f40: 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43  int btreeGetHasC
4f50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4f60: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
4f70: 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20  {.  Bitvec *p = 
4f80: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4f90: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
4fa0: 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69   (pgno>sqlite3Bi
4fb0: 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73  tvecSize(p) || s
4fc0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4fd0: 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a  (p, pgno)));.}..
4fe0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73  /*.** Clear (des
4ff0: 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72  troy) the BtShar
5000: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
5010: 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75  itvec. This shou
5020: 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ld be.** invoked
5030: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
5040: 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65  on of each write
5050: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f  -transaction..*/
5060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
5070: 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
5080: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
5090: 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
50a0: 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48  cDestroy(pBt->pH
50b0: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42  asContent);.  pB
50c0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
50d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
50e0: 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  ease all of the 
50f0: 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66  apPage[] pages f
5100: 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
5110: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
5120: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5130: 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20  rPages(BtCursor 
5140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
5150: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70  .  for(i=0; i<=p
5160: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
5170: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
5180: 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
5190: 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ]);.    pCur->ap
51a0: 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d  Page[i] = 0;.  }
51b0: 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
51c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
51d0: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
51e0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
51f0: 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  ment must point 
5200: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
5210: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
5220: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
5230: 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61   (i.e. have eSta
5240: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5250: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
5260: 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75  ion saves the cu
5270: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79  rrent cursor key
5280: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43   in variables pC
5290: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20  ur->nKey and.** 
52a0: 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49  pCur->pKey. SQLI
52b0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
52c0: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
52d0: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
52e0: 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  or .** code othe
52f0: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
5300: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
5310: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
5320: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
5330: 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28  integer key.** (
5340: 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74  the rowid) is st
5350: 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b  ored in pCur->nK
5360: 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65  ey and pCur->pKe
5370: 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f  y is left set to
5380: 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65  .** NULL. If the
5390: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
53a0: 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  on a non-intkey 
53b0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72  table, then pCur
53c0: 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65  ->pKey is .** se
53d0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
53e0: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
53f0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
5400: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
5410: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e  ing .** the key.
5420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5430: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43  aveCursorKey(BtC
5440: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5450: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5460: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55  OK;.  assert( CU
5470: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
5480: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5490: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
54a0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
54b0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
54c0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
54d0: 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
54e0: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  y ){.    /* Only
54f0: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65   the rowid is re
5500: 71 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62  quired for a tab
5510: 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  le btree */.    
5520: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
5530: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
5540: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  Key(pCur);.  }el
5550: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
5560: 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73  n index btree, s
5570: 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ave the complete
5580: 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   key content */.
5590: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
55a0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
55b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55c0: 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
55d0: 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
55e0: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
55f0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
5600: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
5610: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5620: 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
5630: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
5640: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5650: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5660: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5670: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5690: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
56a0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
56b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
56d0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
56e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
56f0: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
5700: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  !pCur->pKey );. 
5710: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5720: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
5730: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5740: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
5750: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
5760: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
5770: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
5780: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
5790: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
57a0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
57b0: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
57c0: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
57d0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
57e0: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
57f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
5800: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
5810: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
5820: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
5830: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5840: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5850: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
5860: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
5870: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
5880: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5890: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
58a0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
58b0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
58c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
58d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
58e0: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
58f0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5900: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5910: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5920: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
5930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
5940: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
5950: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76  .  }..  rc = sav
5960: 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29  eCursorKey(pCur)
5970: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5980: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
5990: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
59a0: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
59b0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
59c0: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
59d0: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  SEEK;.  }..  pCu
59e0: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
59f0: 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
5a00: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
5a10: 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72  TCF_AtLast);.  r
5a20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5a30: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5a40: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5a50: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5a60: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5a70: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
5a80: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
5a90: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
5aa0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
5ab0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
5ac0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5ad0: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5ae0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5af0: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5b00: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5b10: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5b20: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5b30: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5b40: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5b50: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5b60: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
5b70: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
5b80: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
5b90: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
5ba0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
5bb0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
5bc0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5bd0: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5be0: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5bf0: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5c00: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5c10: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5c20: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5c30: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
5c40: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
5c50: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
5c60: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
5c70: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
5c80: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
5c90: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
5ca0: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5cb0: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
5cc0: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
5cd0: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
5ce0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
5cf0: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
5d00: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
5d10: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
5d20: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
5d30: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
5d40: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
5d50: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
5d60: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
5d70: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
5d80: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
5d90: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
5da0: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
5db0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
5dc0: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
5dd0: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
5de0: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
5df0: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
5e00: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
5e10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
5e20: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
5e30: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
5e40: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
5e50: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
5e60: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
5e70: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
5e80: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
5e90: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
5ea0: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
5eb0: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
5ec0: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
5ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ee0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
5ef0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5f00: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
5f10: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
5f20: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
5f30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5f40: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5f50: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
5f60: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
5f70: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
5f80: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
5f90: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
5fa0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
5fb0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
5fc0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
5fd0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
5fe0: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
5ff0: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
6000: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
6010: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
6020: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
6030: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
6040: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
6050: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
6060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6070: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
6080: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
6090: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
60a0: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
60b0: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
60c0: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
60d0: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
60e0: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
60f0: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
6100: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
6110: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
6120: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
6130: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
6140: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
6150: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
6160: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
6170: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
6180: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
6190: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
61a0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
61b0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
61c0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
61d0: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
61e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
61f0: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
6200: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
6210: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
6220: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
6230: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
6240: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
6250: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
6260: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
6270: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
6280: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
6290: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
62a0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
62b0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
62c0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
62d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
62e0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
62f0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
6300: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
6310: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
6320: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
6330: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
6340: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
6350: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
6360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
6370: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6390: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
63a0: 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Page>0 );.      
63b0: 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
63c0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b  lCursorPages(p);
63d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
63e0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
63f0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a  .  }while( p );.
6400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6410: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
6420: 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ar the current c
6430: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
6440: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
6450: 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
6460: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6470: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
6480: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
6490: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
64a0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
64b0: 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20  .  pCur->pKey = 
64c0: 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  0;.  pCur->eStat
64d0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
64e0: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  ID;.}../*.** In 
64f0: 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
6500: 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
6510: 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
6520: 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
6530: 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
6540: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
6550: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
6560: 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
6570: 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
6580: 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
6590: 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
65a0: 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61  the work..*/.sta
65b0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76  tic int btreeMov
65c0: 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
65d0: 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
65e0: 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
65f0: 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
6600: 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
6610: 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
6620: 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
6630: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
6640: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
6650: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
6660: 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
6670: 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
6680: 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
6690: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
66a0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
66b0: 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
66c0: 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
66d0: 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
66e0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
66f0: 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
6700: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
6710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6720: 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
6730: 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
6740: 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
6750: 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
6760: 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20  index key */..  
6770: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
6780: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
6790: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
67a0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
67b0: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
67c0: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75  packedRecord(pCu
67d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  r->pKeyInfo);.  
67e0: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
67f0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
6800: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
6810: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
6820: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
6830: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
6840: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
6850: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
6860: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
6870: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6880: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
6890: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
68a0: 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
68b0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  );.      goto mo
68c0: 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d  veto_done;.    }
68d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
68e0: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
68f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
6900: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
6910: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
6920: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
6930: 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a  );.moveto_done:.
6940: 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
6950: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6960: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
6970: 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b  o->db, pIdxKey);
6980: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
69a0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
69b0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
69c0: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
69d0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
69e0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
69f0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6a00: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
6a10: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
6a20: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6a30: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6a40: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6a50: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6a60: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6a70: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6a80: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6a90: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6aa0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6ab0: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
6ac0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
6ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6ae0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
6af0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
6b00: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
6b10: 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e   rc;.  int skipN
6b20: 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ext;.  assert( c
6b30: 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
6b40: 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6b70: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
6b80: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6b90: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
6ba0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
6bb0: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
6bc0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
6bd0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
6be0: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
6bf0: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
6c00: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
6c10: 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69   &skipNext);.  i
6c20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6c30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6c40: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
6c50: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
6c60: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
6c70: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
6c80: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
6c90: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6ca0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
6cb0: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
6cc0: 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a  xt |= skipNext;.
6cd0: 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
6ce0: 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e  ipNext && pCur->
6cf0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
6d00: 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43  ALID ){.      pC
6d10: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
6d20: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
6d30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6d40: 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20   rc;.}..#define 
6d50: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6d60: 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d  ition(p) \.  (p-
6d70: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6d80: 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a  REQUIRESEEK ? \.
6d90: 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65           btreeRe
6da0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6db0: 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20  ion(p) : \.     
6dc0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a      SQLITE_OK)..
6dd0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
6de0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
6df0: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
6e00: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74  d from the posit
6e10: 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ion where.** it 
6e20: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c  was last placed,
6e30: 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76   or has been inv
6e40: 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79  alidated for any
6e50: 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a   other reason..*
6e60: 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f  * Cursors can mo
6e70: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
6e80: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
6e90: 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20  g at is deleted 
6ea0: 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65  out.** from unde
6eb0: 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d  r them, for exam
6ec0: 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67  ple.  Cursor mig
6ed0: 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20  ht also move if 
6ee0: 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65  a btree.** is re
6ef0: 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
6f00: 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
6f10: 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c  tine with a NULL
6f20: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20   cursor pointer 
6f30: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a  returns false..*
6f40: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70  *.** Use the sep
6f50: 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72  arate sqlite3Btr
6f60: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6f70: 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73  ) routine to res
6f80: 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a  tore a cursor.**
6f90: 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69   back to where i
6fa0: 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66  t ought to be if
6fb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
6fc0: 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  turns true..*/.i
6fd0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
6fe0: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
6ff0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
7000: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53   return pCur->eS
7010: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7020: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ID;.}../*.** Thi
7030: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72  s routine restor
7040: 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b  es a cursor back
7050: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
7060: 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20   position after 
7070: 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  it.** has been m
7080: 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74  oved by some out
7090: 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73  side activity (s
70a0: 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72  uch as a btree r
70b0: 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61  ebalance or.** a
70c0: 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e   row having been
70d0: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
70e0: 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
70f0: 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20  or).  .**.** On 
7100: 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44  success, the *pD
7110: 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61  ifferentRow para
7120: 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69  meter is false i
7130: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
7140: 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  left.** pointing
7150: 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20   at exactly the 
7160: 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66  same row.  *pDif
7170: 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20  ferntRow is the 
7180: 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  row the cursor.*
7190: 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74  * was pointing t
71a0: 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  o has been delet
71b0: 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20  ed, forcing the 
71c0: 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
71d0: 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62  to some.** nearb
71e0: 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  y row..**.** Thi
71f0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
7200: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
7210: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
7220: 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a  t just returned.
7230: 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c  ** TRUE from sql
7240: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
7250: 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e  asMoved()..*/.in
7260: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
7270: 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75  rsorRestore(BtCu
7280: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
7290: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b  *pDifferentRow){
72a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
72b0: 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
72c0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
72d0: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
72e0: 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20  VALID );.  rc = 
72f0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
7300: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
7310: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44  f( rc ){.    *pD
7320: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b  ifferentRow = 1;
7330: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
7340: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
7350: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
7360: 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69  ALID ){.    *pDi
7370: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
7380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7390: 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
73a0: 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ext==0 );.    *p
73b0: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30  DifferentRow = 0
73c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
73d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
73e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
73f0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
7400: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e  *.** Provide hin
7410: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7420: 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c 61  .  The particula
7430: 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e  r hint given (an
7440: 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e  d the type.** an
7450: 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  d number of the 
7460: 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74 65  varargs paramete
7470: 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65  rs) is determine
7480: 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54 79  d by the eHintTy
7490: 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e  pe.** parameter.
74a0: 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e 69    See the defini
74b0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52  tions of the BTR
74c0: 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73  EE_HINT_* macros
74d0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
74e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
74f0: 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43  eeCursorHint(BtC
7500: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
7510: 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29   eHintType, ...)
7520: 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79  {.  /* Used only
7530: 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74 20   by system that 
7540: 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69 72  substitute their
7550: 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67   own storage eng
7560: 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a  ine */.}.#endif.
7570: 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66  ./*.** Provide f
7580: 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65  lag hints to the
7590: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64   cursor..*/.void
75a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
75b0: 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43  sorHintFlags(BtC
75c0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73  ursor *pCur, uns
75d0: 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65  igned x){.  asse
75e0: 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45  rt( x==BTREE_SEE
75f0: 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45  K_EQ || x==BTREE
7600: 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d  _BULKLOAD || x==
7610: 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e  0 );.  pCur->hin
7620: 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e  ts = x;.}...#ifn
7630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7640: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
7650: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
7660: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
7670: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
7680: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
7690: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
76a0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
76b0: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
76c0: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
76d0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
76e0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
76f0: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
7700: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
7710: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
7720: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
7730: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
7740: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
7750: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
7760: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
7770: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
7780: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
7790: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
77a0: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
77b0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
77c0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
77d0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
77e0: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
77f0: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
7800: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7810: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7820: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
7830: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
7840: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
7850: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
7860: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
7870: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
7880: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7890: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
78a0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
78b0: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
78c0: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
78d0: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
78e0: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
78f0: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
7900: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
7910: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
7920: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7930: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
7940: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
7950: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
7960: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
7970: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
7980: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
7990: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
79a0: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
79b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
79c0: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
79d0: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
79e0: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
79f0: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
7a00: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
7a10: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
7a20: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
7a30: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
7a40: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
7a50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
7a60: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
7a70: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
7a80: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
7a90: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
7aa0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7ab0: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
7ac0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7ad0: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
7ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
7af0: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
7b00: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
7b10: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7b20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
7b30: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
7b40: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
7b50: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
7b60: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7b70: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7b80: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
7b90: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
7ba0: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7bb0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7bc0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7bd0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7be0: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7bf0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7c00: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7c10: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
7c20: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
7c30: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
7c40: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
7c50: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
7c60: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
7c70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
7c80: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
7c90: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
7ca0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7cb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7cc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7cd0: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7ce0: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7cf0: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7d00: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7d10: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7d20: 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a  , &pDbPage, 0);.
7d30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7d40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
7d50: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
7d60: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
7d70: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
7d80: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
7d90: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
7da0: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
7db0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7dc0: 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d  T;.    goto ptrm
7dd0: 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61  ap_exit;.  }.  a
7de0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7df0: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7e00: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74  eSize-5 );.  pPt
7e10: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
7e20: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7e30: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
7e40: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
7e50: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
7e60: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7e70: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
7e80: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
7e90: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
7ea0: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
7eb0: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
7ec0: 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72  t));.    *pRC= r
7ed0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7ee0: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
7ef0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7f00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
7f10: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
7f20: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
7f30: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
7f40: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
7f50: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70  t);.    }.  }..p
7f60: 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71  trmap_exit:.  sq
7f70: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
7f80: 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
7f90: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
7fa0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
7fb0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
7fc0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
7fd0: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
7fe0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7ff0: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
8000: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
8010: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
8020: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
8030: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
8040: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
8050: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
8060: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
8070: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
8080: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
8090: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
80a0: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
80b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
80c0: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
80d0: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
80e0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
80f0: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
8100: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
8110: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
8120: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
8130: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
8140: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
8150: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8160: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
8170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
8180: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
8190: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
81a0: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
81b0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
81c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
81d0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
81e0: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
81f0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
8200: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
8210: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
8220: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
8230: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20  rmap, &pDbPage, 
8240: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  0);.  if( rc!=0 
8250: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
8260: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
8270: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
8280: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
8290: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
82a0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
82b0: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
82c0: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
82d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
82e0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
82f0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
8300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8310: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
8320: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
8330: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
8340: 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -5 );.  assert( 
8350: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
8360: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
8370: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
8380: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
8390: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
83a0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
83b0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
83c0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
83d0: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
83e0: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
83f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8400: 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29  PT_PGNO(iPtrmap)
8410: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8420: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
8430: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
8440: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8450: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
8460: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
8470: 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65  ,z,rc).  #define
8480: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
8490: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
84a0: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
84b0: 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72  tOvflPtr(x, y, r
84c0: 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
84d0: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
84e0: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
84f0: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
8500: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
8510: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
8520: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
8530: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
8540: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
8550: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
8560: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
8570: 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ** findCellPastP
8580: 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61  tr() does the sa
8590: 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69  me except it ski
85a0: 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74  ps past the init
85b0: 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68  ial.** 4-byte ch
85c0: 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e  ild pointer foun
85d0: 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  d on interior pa
85e0: 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73  ges, if there is
85f0: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   one..**.** This
8600: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
8610: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
8620: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
8630: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
8640: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
8650: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
8660: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
8670: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
8680: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
8690: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
86a0: 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66  I)]))).#define f
86b0: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50  indCellPastPtr(P
86c0: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
86d0: 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e  ataOfst + ((P)->
86e0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
86f0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8700: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8710: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
8720: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20   is common tail 
8730: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62  processing for b
8740: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8750: 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50  () and.** btreeP
8760: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
8770: 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  () for the case 
8780: 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f  when the cell do
8790: 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72  es not fit entir
87a0: 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67  ely.** on a sing
87b0: 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20  le B-tree page. 
87c0: 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20   Make necessary 
87d0: 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74  adjustments to t
87e0: 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73  he CellInfo.** s
87f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
8800: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
8810: 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61  INE void btreePa
8820: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
8830: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20  eForOverflow(.  
8840: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8850: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8860: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8870: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8880: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8890: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
88a0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
88b0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
88c0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
88d0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
88e0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ture */.){.  /* 
88f0: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
8900: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
8910: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
8920: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
8930: 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65  e.  ** to decide
8940: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8950: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
8960: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
8970: 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66   onto.  ** overf
8980: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
8990: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
89a0: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
89b0: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a  nt of unused.  *
89c0: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
89d0: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
89e0: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
89f0: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
8a00: 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77  age.  ** in betw
8a10: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
8a20: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a   maxLocal..  **.
8a30: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
8a40: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
8a50: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
8a60: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
8a70: 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20  in any.  ** way 
8a80: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
8a90: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
8aa0: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f  ile format..  */
8ab0: 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b  .  int minLocal;
8ac0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
8ad0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8ae0: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8af0: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
8b00: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
8b10: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
8b20: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
8b30: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
8b40: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
8b50: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
8b60: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
8b70: 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ..  minLocal = p
8b80: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
8b90: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
8ba0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8bb0: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
8bc0: 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  al + (pInfo->nPa
8bd0: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
8be0: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
8bf0: 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20  sableSize-4);.  
8c00: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
8c10: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
8c20: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8c30: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
8c40: 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20  ;.  if( surplus 
8c50: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
8c60: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8c70: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8c80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8c90: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
8ca0: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  16)minLocal;.  }
8cb0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
8cc0: 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e  = (u16)(&pInfo->
8cd0: 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e  pPayload[pInfo->
8ce0: 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29  nLocal] - pCell)
8cf0: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
8d00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
8d10: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
8d20: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
8d30: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
8d40: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
8d50: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
8d60: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
8d70: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
8d80: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
8d90: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
8da0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8db0: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
8dc0: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
8dd0: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
8de0: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
8df0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
8e00: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
8e10: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8e20: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
8e30: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
8e40: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
8e50: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
8e60: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
8e70: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
8e80: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
8e90: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
8ea0: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
8eb0: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
8ec0: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
8ed0: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
8ee0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
8ef0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8f00: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
8f10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8f20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8f30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8f40: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8f50: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8f60: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8f70: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
8f80: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
8f90: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
8fa0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
8fb0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
8fc0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8fd0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8fe0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8ff0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9000: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
9010: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
9020: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69  PtrSize==4 );.#i
9030: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
9040: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
9050: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
9060: 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  ndif.  pInfo->nS
9070: 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72  ize = 4 + getVar
9080: 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28  int(&pCell[4], (
9090: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
90a0: 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  y);.  pInfo->nPa
90b0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e  yload = 0;.  pIn
90c0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a  fo->nLocal = 0;.
90d0: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
90e0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
90f0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
9100: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9110: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9120: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9130: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9140: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9150: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9160: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9170: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9180: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
9190: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
91a0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
91b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
91c0: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
91d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
91e0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
91f0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
9200: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
9210: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9220: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
9230: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20  ayload */.  u64 
9240: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
9250: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64      /* Extracted
9260: 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20   Key value */.. 
9270: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9280: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9290: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
92a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
92b0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
92c0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
92d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
92e0: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20  >intKeyLeaf );. 
92f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9300: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
9310: 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65  );.  pIter = pCe
9320: 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ll;..  /* The ne
9330: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
9340: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
9350: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
9360: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
9370: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61  int32(pIter, nPa
9380: 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a  yload);.  **.  *
9390: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
93a0: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
93b0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
93c0: 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20    */.  nPayload 
93d0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
93e0: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
93f0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
9400: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
9410: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
9420: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
9430: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
9440: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
9450: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9460: 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65    }while( (*pIte
9470: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
9480: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
9490: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  pIter++;..  /* T
94a0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
94b0: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
94c0: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
94d0: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
94e0: 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20  etVarint(pIter, 
94f0: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
9500: 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ey);.  **.  ** T
9510: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9520: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9530: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9540: 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65  /.  iKey = *pIte
9550: 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30  r;.  if( iKey>=0
9560: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9570: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b  End = &pIter[7];
9580: 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37  .    iKey &= 0x7
9590: 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b  f;.    while(1){
95a0: 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69  .      iKey = (i
95b0: 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  Key<<7) | (*++pI
95c0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
95d0: 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c     if( (*pIter)<
95e0: 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  0x80 ) break;.  
95f0: 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70      if( pIter>=p
9600: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69  End ){.        i
9610: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20  Key = (iKey<<8) 
9620: 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20  | *++pIter;.    
9630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9640: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
9650: 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f  Iter++;..  pInfo
9660: 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29  ->nKey = *(i64*)
9670: 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e  &iKey;.  pInfo->
9680: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
9690: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
96a0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
96b0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
96c0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
96d0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
96e0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
96f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
9700: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
9710: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
9720: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
9730: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
9740: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
9750: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
9760: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
9770: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
9780: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
9790: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
97a0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
97b0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
97c0: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
97d0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
97e0: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
97f0: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
9800: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
9810: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
9820: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
9830: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
9840: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
9850: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
9860: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
9870: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
9880: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9890: 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61  trIndex(.  MemPa
98a0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
98b0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
98c0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
98d0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
98f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
9900: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
9910: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
9920: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
9930: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
9940: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  */.){.  u8 *pIte
9950: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9960: 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20  /* For scanning 
9970: 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f  through pCell */
9980: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
9990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
99a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
99b0: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
99c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
99d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
99e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
99f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9a00: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
9a10: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
9a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9a30: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  ge->intKeyLeaf==
9a40: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
9a50: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
9a60: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
9a70: 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b  ayload = *pIter;
9a80: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e  .  if( nPayload>
9a90: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
9aa0: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38  *pEnd = &pIter[8
9ab0: 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ];.    nPayload 
9ac0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
9ad0: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
9ae0: 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20  = (nPayload<<7) 
9af0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
9b00: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
9b10: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
9b20: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
9b30: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9b40: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
9b50: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9b60: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
9b70: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
9b80: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
9b90: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
9ba0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9bb0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9bc0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9bd0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9be0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
9bf0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
9c00: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
9c10: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
9c20: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
9c30: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
9c40: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
9c50: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
9c60: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
9c70: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
9c80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
9c90: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
9ca0: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
9cb0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
9cc0: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
9cd0: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
9ce0: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
9cf0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
9d00: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
9d10: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
9d20: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9d30: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
9d40: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
9d50: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9d60: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9d70: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
9d80: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9d90: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9da0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
9db0: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
9dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
9dd0: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
9de0: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
9df0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9e00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9e10: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9e20: 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d  e */.){.  pPage-
9e30: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
9e40: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
9e50: 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f  e, iCell), pInfo
9e60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
9e70: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9e80: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9e90: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9ea0: 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a  mPage.xCellSize.
9eb0: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
9ec0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
9ed0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
9ee0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
9ef0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
9f00: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
9f10: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
9f20: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
9f30: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
9f40: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
9f50: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
9f60: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
9f70: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
9f80: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
9f90: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
9fa0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
9fb0: 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  **.** cellSizePt
9fc0: 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20  rNoPayload()    
9fd0: 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72  =>   table inter
9fe0: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c  nal nodes.** cel
9ff0: 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20  lSizePtr()      
a000: 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20         =>   all 
a010: 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61  index nodes & ta
a020: 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ble leaf nodes.*
a030: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
a040: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
a050: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
a060: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
a070: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
a080: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20  ->childPtrSize; 
a090: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
a0a0: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
a0b0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
a0c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
a0f0: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75   a varint */.  u
a100: 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  32 nSize;       
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a130: 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
a140: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a150: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
a160: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
a170: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
a180: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
a190: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
a1a0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
a1b0: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
a1c0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
a1d0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
a1e0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
a1f0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
a200: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
a210: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
a220: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
a230: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
a240: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
a250: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
a260: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
a270: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
a280: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
a290: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
a2a0: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
a2b0: 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20  ndif..  nSize = 
a2c0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
a2d0: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
a2e0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
a2f0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
a300: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a310: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
a320: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
a330: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
a340: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
a350: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
a360: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
a370: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
a380: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
a390: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
a3a0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
a3b0: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
a3c0: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
a3d0: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
a3e0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
a3f0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
a400: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
a410: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
a420: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
a430: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a440: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
a450: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a460: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
a470: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a480: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a490: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
a4a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a4b0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
a4c0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a4d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
a4e0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
a4f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a500: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
a510: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
a520: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
a530: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
a540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a550: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
a560: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
a570: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a580: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
a590: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
a5a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a5b0: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
a5c0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a5d0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a5e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a5f0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a600: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
a610: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
a620: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a630: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
a640: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
a650: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
a660: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a670: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
a680: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
a690: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
a6a0: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a6b0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
a6c0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a6d0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
a6e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a6f0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a700: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a710: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
a720: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a730: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a740: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a750: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
a760: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
a770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a780: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
a790: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
a7a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
a7b0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
a7c0: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
a7d0: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
a7e0: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
a7f0: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
a800: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
a810: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
a820: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
a830: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
a840: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
a850: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
a860: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
a870: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
a880: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
a890: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
a8a0: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
a8b0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a8c0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
a8d0: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
a8e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a8f0: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
a900: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a910: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
a920: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
a930: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
a940: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a950: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
a970: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
a980: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a990: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
a9a0: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
a9b0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a9c0: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
a9d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
a9e0: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
a9f0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
aa00: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
aa10: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
aa20: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
aa30: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
aa40: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
aa50: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
aa60: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
aa70: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
aa80: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
aa90: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
aaa0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
aab0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
aac0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
aad0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
aae0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
aaf0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
ab00: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
ab10: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
ab20: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
ab30: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
ab40: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
ab50: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
ab60: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
ab70: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
ab80: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
ab90: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
aba0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
abb0: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
abc0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
abd0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
abe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
ac00: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
ac10: 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
ac20: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e  yload ){.    Pgn
ac30: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
ac40: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53  e(&pCell[info.nS
ac50: 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72  ize-4]);.    ptr
ac60: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
ac70: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
ac80: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
ac90: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
aca0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
acb0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
acc0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68  e page given. Th
acd0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67  is routine reorg
ace0: 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74  anizes cells wit
acf0: 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hin the.** page 
ad00: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
ad10: 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73  e no free-blocks
ad20: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f   on the free-blo
ad30: 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50  ck list..**.** P
ad40: 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61  arameter nMaxFra
ad50: 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  g is the maximum
ad60: 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d   amount of fragm
ad70: 65 6e 74 65 64 20 73 70 61 63 65 20 74 68 61 74  ented space that
ad80: 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65   may be.** prese
ad90: 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 61  nt in the page a
ada0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
adb0: 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  e returns..**.**
adc0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
add0: 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69  44582-60138 SQLi
ade0: 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65  te may from time
adf0: 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e   to time reorgan
ae00: 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20  ize a.** b-tree 
ae10: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
ae20: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c  re are no freebl
ae30: 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74  ocks or fragment
ae40: 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75   bytes, all.** u
ae50: 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20  nused bytes are 
ae60: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
ae70: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61   unallocated spa
ae80: 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61  ce region, and a
ae90: 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20  ll.** cells are 
aea0: 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61  packed tightly a
aeb0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
aec0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
aed0: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
aee0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
aef0: 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67  ge, int nMaxFrag
af00: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
af30: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
af60: 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  e i-th cell */. 
af70: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
af80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
af90: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
afa0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
afb0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
afc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
afd0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
afe0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
aff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b000: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
b010: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
b020: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
b030: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
b040: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
b050: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
b060: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
b070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b080: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
b090: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b0a0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
b0b0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
b0c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b0d0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
b0e0: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
b0f0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
b100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
b110: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
b120: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
b130: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
b140: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
b150: 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ent */.  unsigne
b160: 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20  d char *src;    
b170: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66      /* Source of
b180: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
b190: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
b1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b1b0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
b1c0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
b1d0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
b1e0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
b1f0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
b200: 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ex */..  assert(
b210: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b220: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b230: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b240: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b250: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b260: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b270: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
b280: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
b290: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b2a0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b2b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b2c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b2e0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
b2f0: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
b300: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b310: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b320: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
b330: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b340: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
b350: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
b360: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
b370: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
b380: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
b390: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
b3a0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
b3b0: 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
b3c0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
b3d0: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  sableSize;..  /*
b3e0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
b3f0: 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74  les pages with t
b400: 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65  wo or fewer free
b410: 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78   blocks and nMax
b420: 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77  Frag.  ** or few
b430: 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  er fragmented by
b440: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
b450: 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74  e it is faster t
b460: 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  o move the.  ** 
b470: 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f  two (or one) blo
b480: 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69  cks of cells usi
b490: 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64  ng memmove() and
b4a0: 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65   add the require
b4b0: 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74  d.  ** offsets t
b4c0: 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69  o each pointer i
b4d0: 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
b4e0: 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74  er array than it
b4f0: 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63   is to .  ** rec
b500: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74  onstruct the ent
b510: 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ire page.  */.  
b520: 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64  if( (int)data[hd
b530: 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29  r+7]<=nMaxFrag )
b540: 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20  {.    int iFree 
b550: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b560: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66  [hdr+1]);.    if
b570: 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( iFree ){.     
b580: 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67 65   int iFree2 = ge
b590: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
b5a0: 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ee]);..      /* 
b5b0: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 68  pageFindSlot() h
b5c0: 61 73 20 61 6c 72 65 61 64 79 20 76 65 72 69 66  as already verif
b5d0: 69 65 64 20 74 68 61 74 20 66 72 65 65 20 62 6c  ied that free bl
b5e0: 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65 64 0a  ocks are sorted.
b5f0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
b600: 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69 74 68  r of offset with
b610: 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61 6e 64  in the page, and
b620: 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65   that no block e
b630: 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20  xtends.      ** 
b640: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
b650: 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76 69 64  the page. Provid
b660: 65 64 20 74 68 65 20 74 77 6f 20 66 72 65 65 20  ed the two free 
b670: 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20  slots do not .  
b680: 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20      ** overlap, 
b690: 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  this guarantees 
b6a0: 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65  that the memmove
b6b0: 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77  () calls below w
b6c0: 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  ill not.      **
b6d0: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 75   overwrite the u
b6e0: 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65 20 62  sableSize byte b
b6f0: 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66 20 74  uffer, even if t
b700: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
b710: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 72  .      ** is cor
b720: 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rupt.  */.      
b730: 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d  assert( iFree2==
b740: 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46 72 65  0 || iFree2>iFre
b750: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b760: 74 28 20 69 46 72 65 65 2b 67 65 74 32 62 79 74  t( iFree+get2byt
b770: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d  e(&data[iFree+2]
b780: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
b790: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b7a0: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
b7b0: 72 65 65 32 2b 67 65 74 32 62 79 74 65 28 26 64  ree2+get2byte(&d
b7c0: 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c  ata[iFree2+2]) <
b7d0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
b7e0: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46  .      if( 0==iF
b7f0: 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46  ree2 || (data[iF
b800: 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61  ree2]==0 && data
b810: 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29  [iFree2+1]==0) )
b820: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45  {.        u8 *pE
b830: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
b840: 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
b850: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41  ;.        u8 *pA
b860: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ddr;.        int
b870: 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   sz2 = 0;.      
b880: 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
b890: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
b8a0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  2]);.        int
b8b0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
b8c0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
b8d0: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
b8e0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  2 ){.          i
b8f0: 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65  f( iFree+sz>iFre
b900: 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e2 ) return SQLI
b910: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
b920: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
b930: 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65          sz2 = ge
b940: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
b950: 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ee2+2]);.       
b960: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
b970: 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d 28  +sz+sz2+iFree2-(
b980: 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73 61  iFree+sz) <= usa
b990: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
b9a0: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61       memmove(&da
b9b0: 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d  ta[iFree+sz+sz2]
b9c0: 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  , &data[iFree+sz
b9d0: 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65  ], iFree2-(iFree
b9e0: 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  +sz));.         
b9f0: 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20   sz += sz2;.    
ba00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62      }.        cb
ba10: 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20  rk = top+sz;.   
ba20: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72       assert( cbr
ba30: 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d  k+(iFree-top) <=
ba40: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
ba50: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
ba60: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74  data[cbrk], &dat
ba70: 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f  a[top], iFree-to
ba80: 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  p);.        for(
ba90: 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c  pAddr=&data[cell
baa0: 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70  Offset]; pAddr<p
bab0: 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a  End; pAddr+=2){.
bac0: 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67            pc = g
bad0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
bae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
baf0: 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79  <iFree ){ put2by
bb00: 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29  te(pAddr, pc+sz)
bb10: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c  ; }.          el
bb20: 73 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32  se if( pc<iFree2
bb30: 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64   ){ put2byte(pAd
bb40: 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20  dr, pc+sz2); }. 
bb50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bb60: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
bb70: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
bb80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20    }.  }..  cbrk 
bb90: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
bba0: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
bbb0: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
bbc0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
bbd0: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
bbe0: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
bbf0: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
bc00: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
bc10: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
bc20: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
bc30: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
bc40: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
bc50: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
bc60: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
bc70: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
bc80: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  );.    /* These 
bc90: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
bca0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
bcb0: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
bcc0: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
bcd0: 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73  if PRAGMA cell_s
bce0: 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20  ize_check=ON..  
bcf0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
bd00: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
bd10: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
bd20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bd30: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
bd40: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
bd50: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
bd60: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
bd70: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
bd80: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61  ;.    size = pPa
bd90: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
bda0: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
bdb0: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
bdc0: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ;.    if( cbrk<i
bdd0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
bde0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
bdf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
be00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
be10: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
be20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
be30: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
be40: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
be50: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
be60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
be70: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
be80: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
be90: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
bea0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
beb0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
bec0: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
bed0: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
bee0: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
bef0: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
bf00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
bf10: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
bf20: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
bf30: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
bf40: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
bf50: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
bf60: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
bf70: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
bf80: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
bf90: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
bfa0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
bfb0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
bfc0: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
bfd0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
bfe0: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
bff0: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
c000: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
c010: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
c020: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
c030: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c040: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
c050: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
c060: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
c070: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
c080: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c090: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
c0a0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c0b0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c0c0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c0d0: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c0e0: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c0f0: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c100: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c110: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c120: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
c130: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c140: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
c150: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
c160: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
c170: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
c180: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
c190: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
c1a0: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
c1b0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
c1c0: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
c1d0: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
c1e0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c1f0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
c200: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
c210: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
c220: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
c230: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c240: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c250: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
c260: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
c270: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
c280: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
c290: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
c2a0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
c2b0: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
c2c0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
c2d0: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
c2e0: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
c2f0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
c300: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
c310: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
c320: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
c330: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
c340: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
c350: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
c360: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
c370: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
c380: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
c390: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
c3a0: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
c3b0: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
c3c0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
c3d0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
c3e0: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
c3f0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
c400: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
c410: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
c420: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
c430: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
c440: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
c450: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
c460: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
c470: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
c480: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
c490: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69    do{.    int si
c4a0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
c4b0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72  * Size of the fr
c4c0: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f  ee slot */.    /
c4d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
c4e0: 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65  -06866-39125 Fre
c4f0: 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61  eblocks are alwa
c500: 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20  ys connected in 
c510: 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  order of.    ** 
c520: 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65  increasing offse
c530: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  t. */.    if( pc
c540: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
c550: 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20   pc<iAddr+4 ){. 
c560: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
c570: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
c580: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
c590: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c5a0: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
c5b0: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
c5c0: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
c5d0: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
c5e0: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
c5f0: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
c600: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
c610: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
c620: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
c630: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
c640: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
c650: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
c660: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
c670: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
c680: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
c690: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
c6a0: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
c6b0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
c6c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c6d0: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
c6e0: 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65  if( pc < pPg->ce
c6f0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e  llOffset+2*pPg->
c700: 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63  nCell || size+pc
c710: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
c720: 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
c730: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c740: 47 4e 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  GNO(pPg->pgno);.
c750: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
c760: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
c770: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
c780: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c790: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
c7a0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
c7b0: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
c7c0: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
c7d0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
c7e0: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
c7f0: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
c800: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
c810: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
c820: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
c830: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
c840: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
c850: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
c860: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
c870: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
c880: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
c890: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
c8a0: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
c8b0: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
c8c0: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
c8d0: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
c8e0: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
c8f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c900: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
c910: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
c920: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
c930: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
c940: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
c950: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
c960: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
c970: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
c980: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
c990: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
c9a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c9b0: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
c9c0: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
c9d0: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
c9e0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c9f0: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d  &aData[pc]);.  }
ca00: 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20  while( pc );..  
ca10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ca20: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
ca30: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
ca40: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
ca50: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
ca60: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
ca70: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
ca80: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
ca90: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
caa0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
cab0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
cac0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
cad0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
cae0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
caf0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
cb00: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
cb10: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
cb20: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
cb30: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
cb40: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
cb50: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
cb60: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
cb70: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
cb80: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
cb90: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
cba0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
cbb0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
cbc0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
cbd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
cbe0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
cbf0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
cc00: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
cc10: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
cc20: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
cc30: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
cc40: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
cc50: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
cc60: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
cc70: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
cc80: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
cc90: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
cca0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
ccb0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
ccc0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
ccd0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
cce0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
ccf0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
cd00: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
cd10: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
cd20: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
cd30: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
cd40: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
cd50: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
cd60: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
cd70: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
cd80: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
cdb0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
cdc0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
cdd0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
cde0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
cdf0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
ce00: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ce10: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
ce20: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
ce30: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
ce40: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
ce50: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
ce60: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
ce70: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
ce80: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
ce90: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
cea0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
ceb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cec0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ced0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
cee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
cef0: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
cf00: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
cf10: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
cf20: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
cf30: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
cf40: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cf50: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
cf60: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
cf70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
cf80: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
cf90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
cfa0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
cfb0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
cfc0: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
cfd0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
cfe0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
cff0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
d000: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
d010: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d020: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
d030: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
d040: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
d050: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
d060: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
d070: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
d080: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
d090: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
d0a0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
d0b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
d0c0: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
d0d0: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
d0e0: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
d0f0: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
d100: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
d110: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
d120: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
d130: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
d140: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
d150: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
d160: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
d170: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d180: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
d190: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
d1a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d1b0: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
d1c0: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
d1d0: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
d1e0: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
d1f0: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
d200: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d210: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
d220: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
d230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d240: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d250: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
d260: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
d270: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
d280: 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
d290: 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61  ce between gap a
d2a0: 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d  nd top for one m
d2b0: 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ore cell pointer
d2c0: 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72  .  ** array entr
d2d0: 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66  y offset, and if
d2e0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
d2f0: 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e   not empty, then
d300: 20 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a   search the.  **
d310: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
d320: 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f  g for a free slo
d330: 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  t big enough to 
d340: 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75  satisfy the requ
d350: 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  est..  */.  test
d360: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
d370: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
d380: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
d390: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
d3a0: 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74  op );.  if( (dat
d3b0: 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61  a[hdr+2] || data
d3c0: 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b  [hdr+1]) && gap+
d3d0: 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38  2<=top ){.    u8
d3e0: 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46   *pSpace = pageF
d3f0: 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e  indSlot(pPage, n
d400: 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Byte, &rc);.    
d410: 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20  if( pSpace ){.  
d420: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61      assert( pSpa
d430: 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70  ce>=data && (pSp
d440: 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33  ace - data)<6553
d450: 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78  6 );.      *pIdx
d460: 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20   = (int)(pSpace 
d470: 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72  - data);.      r
d480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d490: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
d4a0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
d4b0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
d4c0: 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73  .  /* The reques
d4d0: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66  t could not be f
d4e0: 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61  ulfilled using a
d4f0: 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20   freelist slot. 
d500: 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   Check.  ** to s
d510: 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74  ee if defragment
d520: 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
d530: 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ry..  */.  testc
d540: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
d550: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
d560: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
d570: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
d580: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
d590: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
d5a0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
d5b0: 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e  tPage(pPage, MIN
d5c0: 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  (4, pPage->nFree
d5d0: 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a   - (2+nByte)));.
d5e0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
d5f0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
d600: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
d610: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
d620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
d630: 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  +2+nByte<=top );
d640: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
d650: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
d660: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
d670: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
d680: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
d690: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
d6a0: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
d6b0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
d6c0: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
d6d0: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
d6e0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
d6f0: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
d700: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
d710: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
d720: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
d730: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
d740: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
d750: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
d760: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
d770: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
d780: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
d790: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
d7a0: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
d7b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d7c0: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
d7d0: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
d7e0: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
d7f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
d800: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
d810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d820: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
d830: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
d840: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
d850: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
d860: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
d870: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
d880: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
d890: 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74  ge->aData[iStart
d8a0: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
d8b0: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
d8c0: 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  s iSize bytes..*
d8d0: 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72  *.** Adjacent fr
d8e0: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61  eeblocks are coa
d8f0: 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  lesced..**.** No
d900: 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  te that even tho
d910: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
d920: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
d930: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
d940: 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72  age(),.** that r
d950: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
d960: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62  detect overlap b
d970: 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20  etween cells or 
d980: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72  freeblocks.  Nor
d990: 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65  .** does it dete
d9a0: 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  ct cells or free
d9b0: 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72  blocks that encr
d9c0: 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65  ouch into the re
d9d0: 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20  served bytes.** 
d9e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d9f0: 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61  e page.  So do a
da00: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70  dditional corrup
da10: 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69  tion checks insi
da20: 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  de this.** routi
da30: 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ne and return SQ
da40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
da50: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65  any problems are
da60: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
da70: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
da80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
da90: 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20  u16 iStart, u16 
daa0: 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50  iSize){.  u16 iP
dab0: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
dae0: 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c  r to next freebl
daf0: 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72  ock */.  u16 iFr
db00: 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20  eeBlk;          
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db20: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
db30: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
db40: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
db70: 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20  ge header size. 
db80: 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75   0 or 100 */.  u
db90: 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20  8 nFrag = 0;    
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f       /* Reductio
dbc0: 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69  n in fragmentati
dbd0: 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69  on */.  u16 iOri
dbe0: 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20  gSize = iSize;  
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc00: 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
dc10: 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33  of iSize */.  u3
dc20: 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d  2 iLast = pPage-
dc30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
dc40: 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70  -4; /* Largest p
dc50: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
dc60: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33  k offset */.  u3
dc70: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
dc80: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
dc90: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
dca0: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
dcb0: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
dcc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
dcd0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
dce0: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
dcf0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
dd00: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
dd10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
dd20: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
dd30: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
dd40: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
dd50: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
dd60: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
dd70: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
dd80: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
dd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
dda0: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
ddb0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
ddc0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
ddd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
dde0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
ddf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
de00: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
de10: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
de20: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
de30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
de40: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a  tart<=iLast );..
de50: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
de60: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
de70: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
de80: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
de90: 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  lete.  ** option
dea0: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
deb0: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
dec0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
ded0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
dee0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
def0: 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
df00: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
df10: 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65  The list of free
df20: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
df30: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
df40: 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20  r.  Find the .  
df50: 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c  ** spot on the l
df60: 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74  ist where iStart
df70: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
df80: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20  ted..  */.  hdr 
df90: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
dfa0: 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72  et;.  iPtr = hdr
dfb0: 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61   + 1;.  if( data
dfc0: 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64  [iPtr+1]==0 && d
dfd0: 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a  ata[iPtr]==0 ){.
dfe0: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30      iFreeBlk = 0
dff0: 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66  ;  /* Shortcut f
e000: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
e010: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
e020: 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73   empty */.  }els
e030: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69  e{.    while( (i
e040: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
e050: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29  te(&data[iPtr]))
e060: 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  <iStart ){.     
e070: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50   if( iFreeBlk<iP
e080: 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  tr+4 ){.        
e090: 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20  if( iFreeBlk==0 
e0a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
e0b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e0c0: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
e0d0: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
e0e0: 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  }.      iPtr = i
e0f0: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
e100: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
e110: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
e120: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
e130: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
e140: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
e150: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
e160: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
e170: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
e180: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
e190: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
e1a0: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
e1b0: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
e1c0: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
e1d0: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
e1e0: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
e1f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65   pointer to iFre
e200: 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
e210: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
e220: 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
e230: 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
e240: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
e250: 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
e260: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
e270: 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
e280: 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
e290: 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
e2a0: 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
e2b0: 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
e2c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e2d0: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
e2e0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
e2f0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
e300: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e310: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
e320: 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70      if( iEnd > p
e330: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e340: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
e350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e360: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
e370: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
e380: 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20  }.      iSize = 
e390: 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20  iEnd - iStart;. 
e3a0: 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20       iFreeBlk = 
e3b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e3c0: 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d  FreeBlk]);.    }
e3d0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50  .  .    /* If iP
e3e0: 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72  tr is another fr
e3f0: 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73  eeblock (that is
e400: 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74  , if iPtr is not
e410: 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
e420: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20    ** pointer in 
e430: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29  the page header)
e440: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
e450: 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f  ee if iStart sho
e460: 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f  uld be.    ** co
e470: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
e480: 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20   end of iPtr..  
e490: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74    */.    if( iPt
e4a0: 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20  r>hdr+1 ){.     
e4b0: 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69   int iPtrEnd = i
e4c0: 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26  Ptr + get2byte(&
e4d0: 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20  data[iPtr+2]);. 
e4e0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
e4f0: 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20  +3>=iStart ){.  
e500: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
e510: 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72  d>iStart ) retur
e520: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e530: 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
e540: 6f 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  o);.        nFra
e550: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
e560: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
e570: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
e580: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
e590: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
e5a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e5b0: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
e5c0: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
e5d0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
e5e0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
e5f0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
e600: 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66   nFrag;.  }.  if
e610: 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79  ( iStart==get2by
e620: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
e630: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e   ){.    /* The n
e640: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  ew freeblock is 
e650: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
e660: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
e670: 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a  tent area,.    *
e680: 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64  * so just extend
e690: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
e6a0: 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68  t area rather th
e6b0: 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65  an create anothe
e6c0: 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73  r.    ** freelis
e6d0: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69  t entry */.    i
e6e0: 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29  f( iPtr!=hdr+1 )
e6f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e700: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
e710: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75  e->pgno);.    pu
e720: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e730: 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  +1], iFreeBlk);.
e740: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
e750: 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29  ta[hdr+5], iEnd)
e760: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
e770: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
e780: 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20   freeblock into 
e790: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
e7a0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
e7b0: 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74  ta[iPtr], iStart
e7c0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
e7d0: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
e7e0: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
e7f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
e800: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
e810: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
e820: 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b  ee += iOrigSize;
e830: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e840: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
e850: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
e860: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
e870: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
e880: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
e890: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
e8a0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
e8b0: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
e8c0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
e8d0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
e8e0: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
e8f0: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
e900: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
e910: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
e920: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
e930: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
e940: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
e950: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
e960: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
e970: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
e980: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
e990: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
e9a0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
e9b0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
e9c0: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
e9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
e9e0: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
e9f0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
ea00: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
ea10: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
ea20: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
ea30: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
ea40: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
ea50: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
ea60: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
ea70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ea80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ea90: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
eaa0: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
eab0: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
eac0: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
ead0: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
eae0: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
eaf0: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
eb00: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
eb10: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
eb20: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65  e->leaf;.  pPage
eb30: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
eb40: 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74  llSizePtr;.  pBt
eb50: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
eb60: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
eb70: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
eb80: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
eb90: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
eba0: 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20  : R-07291-35328 
ebb0: 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78  A value of 5 (0x
ebc0: 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  05) means the pa
ebd0: 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  ge is an.    ** 
ebe0: 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62  interior table b
ebf0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
ec00: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
ec10: 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
ec20: 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f  KEY)==5 );.    /
ec30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ec40: 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76  -26900-09176 A v
ec50: 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64  alue of 13 (0x0d
ec60: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
ec70: 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
ec80: 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  f table b-tree p
ec90: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
eca0: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
ecb0: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  A|PTF_INTKEY|PTF
ecc0: 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20  _LEAF)==13 );.  
ecd0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
ece0: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
ecf0: 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
ed00: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
ed10: 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  eaf = 1;.      p
ed20: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
ed30: 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
ed40: 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lPtr;.    }else{
ed50: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
ed60: 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
ed70: 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c      pPage->xCell
ed80: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
ed90: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
eda0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
edb0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
edc0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
edd0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
ede0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
edf0: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
ee00: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
ee10: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
ee20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
ee30: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
ee40: 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
ee50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33  IDENCE-OF: R-433
ee60: 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65  16-37308 A value
ee70: 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61   of 2 (0x02) mea
ee80: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
ee90: 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f  n.    ** interio
eea0: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  r index b-tree p
eeb0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
eec0: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
eed0: 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20  A)==2 );.    /* 
eee0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
eef0: 39 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c  9615-42828 A val
ef00: 75 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20  ue of 10 (0x0a) 
ef10: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
ef20: 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20  s a.    ** leaf 
ef30: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
ef40: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
ef50: 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c  ( (PTF_ZERODATA|
ef60: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b  PTF_LEAF)==10 );
ef70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
ef80: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
ef90: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
efa0: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  0;.    pPage->xP
efb0: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
efc0: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
efd0: 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  x;.    pPage->ma
efe0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
eff0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
f000: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
f010: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
f020: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
f030: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30  DENCE-OF: R-4760
f040: 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65  8-56469 Any othe
f050: 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  r value for the 
f060: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
f070: 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   is.    ** an er
f080: 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ror. */.    retu
f090: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f0a0: 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
f0b0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  no);.  }.  pPage
f0c0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
f0d0: 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74  d = pBt->max1byt
f0e0: 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  ePayload;.  retu
f0f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f100: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
f110: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
f120: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
f130: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
f140: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
f150: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
f160: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
f170: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
f180: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
f190: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
f1a0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
f1b0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
f1c0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
f1d0: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
f1e0: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
f1f0: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
f200: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
f210: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
f220: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
f230: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
f240: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
f250: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
f260: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
f270: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
f280: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63  pPage){.  int pc
f290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f2a0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
f2b0: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
f2c0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
f2d0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
f2e0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
f2f0: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
f300: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
f310: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
f320: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
f330: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
f340: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
f350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
f360: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
f370: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  re */.  int usab
f380: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
f390: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
f3a0: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
f3b0: 65 20 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f  e */.  u16 cellO
f3c0: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
f3d0: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
f3e0: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
f3f0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
f400: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
f410: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f420: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
f430: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
f440: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
f450: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
f460: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
f470: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
f480: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
f490: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
f4a0: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
f4b0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
f4c0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
f4d0: 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f  ;     /* Last po
f4e0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  ssible cell or f
f4f0: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
f500: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
f510: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
f520: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f530: 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  pBt->db!=0 );.  
f540: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f550: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
f560: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
f570: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f580: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
f590: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
f5a0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
f5b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
f5c0: 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
f5d0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
f5e0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
f5f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
f600: 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
f610: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
f620: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
f630: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
f640: 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70  sInit==0 );..  p
f650: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
f660: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
f670: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  hdrOffset;.  dat
f680: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
f690: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
f6a0: 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39  OF: R-28594-0289
f6b0: 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66  0 The one-byte f
f6c0: 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30 20  lag at offset 0 
f6d0: 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20  indicating.  ** 
f6e0: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
f6f0: 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64  type. */.  if( d
f700: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
f710: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a  , data[hdr]) ){.
f720: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f730: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
f740: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
f750: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
f760: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
f770: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
f780: 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
f790: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
f7a0: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
f7b0: 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
f7c0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
f7d0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
f7e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
f7f0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
f800: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
f810: 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67  = hdr + 8 + pPag
f820: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
f830: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
f840: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
f850: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
f860: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
f870: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
f880: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
f890: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
f8a0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
f8b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f8c0: 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
f8d0: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
f8e0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
f8f0: 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a   designates.  **
f900: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
f910: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f920: 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
f930: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
f940: 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72  er is.  ** inter
f950: 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
f960: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
f970: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
f980: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20  a[hdr+5]);.  /* 
f990: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
f9a0: 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
f9b0: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
f9c0: 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
f9d0: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
f9e0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
f9f0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61  e page. */.  pPa
fa00: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
fa10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
fa20: 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ]);.  if( pPage-
fa30: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
fa40: 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f  Bt) ){.    /* To
fa50: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
fa60: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
fa70: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
fa80: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
fa90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
faa0: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
fab0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 74  ->pgno);.  }.  t
fac0: 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
fad0: 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
fae0: 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  Bt) );.  /* EVID
faf0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
fb00: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
fb10: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
fb20: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
fb30: 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20  y.  ** possible 
fb40: 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20  for a root page 
fb50: 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  of a table that 
fb60: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73  contains no rows
fb70: 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  ) then the.  ** 
fb80: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
fb90: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
fba0: 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
fbb0: 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
fbc0: 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  he.  ** bytes of
fbd0: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
fbe0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
fbf0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
fc00: 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
fc10: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
fc20: 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d  ..  /* A malform
fc30: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
fc40: 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20   might cause us 
fc50: 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
fc60: 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67   end.  ** of pag
fc70: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
fc80: 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20   cell.  .  **.  
fc90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
fca0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
fcb0: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
fcc0: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
fcd0: 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74  ends.  ** past t
fce0: 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65  he end of a page
fcf0: 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61   boundary and ca
fd00: 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  uses SQLITE_CORR
fd10: 55 50 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20  UPT to be .  ** 
fd20: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
fd30: 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c  oes..  */.  iCel
fd40: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
fd50: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
fd60: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
fd70: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
fd80: 20 34 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64   4;.  if( pBt->d
fd90: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
fda0: 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a  E_CellSizeCk ){.
fdb0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
fdc0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
fdd0: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
fde0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
fdf0: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
fe00: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
fe10: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66   cell */..    if
fe20: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
fe30: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
fe40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
fe50: 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
fe60: 0a 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32  .      pc = get2
fe70: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74  byteAligned(&dat
fe80: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
fe90: 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ]);.      testca
fea0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
feb0: 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  st );.      test
fec0: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
fed0: 61 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ast );.      if(
fee0: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
fef0: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
ff00: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
ff10: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ff20: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
ff30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ff40: 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65   sz = pPage->xCe
ff50: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64  llSize(pPage, &d
ff60: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
ff70: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
ff80: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
ff90: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
ffa0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
ffb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ffc0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
ffd0: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
ffe0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fff0: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
10000 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
10010 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70    }  ..  /* Comp
10020 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
10030 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
10040 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e  page.  ** EVIDEN
10050 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33  CE-OF: R-23588-3
10060 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74  4450 The two-byt
10070 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
10080 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a  set 1 gives the.
10090 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
100a0 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
100b0 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f  k on the page, o
100c0 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  r is zero if the
100d0 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66  re are no.  ** f
100e0 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20  reeblocks. */.  
100f0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
10100 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e  ata[hdr+1]);.  n
10110 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
10120 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e  7] + top;  /* In
10130 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d  it nFree to non-
10140 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73  freeblock free s
10150 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63  pace */.  if( pc
10160 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65  >0 ){.    u32 ne
10170 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66  xt, size;.    if
10180 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
10190 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  ){.      /* EVID
101a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30  ENCE-OF: R-55530
101b0 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c  -52930 In a well
101c0 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
101d0 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a  age, there will.
101e0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
101f0 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
10200 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20  cell before the 
10210 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e  first freeblock.
10220 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10240 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
10250 2d 3e 70 67 6e 6f 29 3b 20 0a 20 20 20 20 7d 0a  ->pgno); .    }.
10260 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
10270 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65        if( pc>iCe
10280 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10290 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f    /* Freeblock o
102a0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
102b0 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
102c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
102d0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
102e0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
102f0 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
10300 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
10310 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
10320 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10330 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e  [pc+2]);.      n
10340 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
10350 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
10360 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
10370 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63   break;.      pc
10380 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
10390 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b     if( next>0 ){
103a0 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c  .      /* Freebl
103b0 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e  ock not in ascen
103c0 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
103d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
103e0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
103f0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
10400 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69   }.    if( pc+si
10410 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ze>(unsigned int
10420 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  )usableSize ){. 
10430 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65       /* Last fre
10440 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70  eblock extends p
10450 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a  ast page end */.
10460 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10470 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
10480 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
10490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
104a0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
104b0 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
104c0 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
104d0 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
104e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
104f0 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
10500 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
10510 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
10520 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  in.  ** the cell
10530 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
10540 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
10550 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
10560 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74  e-size.  ** of t
10570 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
10580 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
10590 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
105a0 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73  heck also.  ** s
105b0 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
105c0 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
105d0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
105e0 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
105f0 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f  .  ** area, acco
10600 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
10610 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77  e header, lies w
10620 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a  ithin the page..
10630 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
10640 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
10650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10660 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
10670 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
10680 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
10690 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
106a0 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50  CellFirst);.  pP
106b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
106c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
106d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
106e0 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
106f0 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
10700 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
10710 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
10720 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
10730 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
10740 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
10750 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
10760 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10770 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
10780 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
10790 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
107a0 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
107b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
107c0 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
107d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
107e0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
107f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10800 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
10810 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10820 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
10830 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10840 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
10850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10860 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10870 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10880 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
10890 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
108a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
108b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
108c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
108d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
108e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
108f0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
10900 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
10910 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
10920 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
10930 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
10940 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
10950 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
10960 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
10970 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73   = hdr + ((flags
10980 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20  &PTF_LEAF)==0 ? 
10990 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65  12 : 8);.  memse
109a0 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
109b0 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
109c0 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
109d0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
109e0 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
109f0 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
10a00 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
10a10 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
10a20 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
10a30 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
10a40 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  );.  pPage->cell
10a50 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
10a60 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
10a70 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75  d = &data[pBt->u
10a80 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
10a90 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
10aa0 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20  &data[first];.  
10ab0 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
10ac0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
10ad0 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
10ae0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
10af0 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
10b00 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
10b10 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
10b20 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
10b30 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
10b40 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
10b50 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
10b60 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
10b70 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
10b80 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
10b90 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
10ba0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
10bb0 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
10bc0 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
10bd0 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
10be0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
10bf0 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
10c00 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
10c10 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
10c20 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
10c30 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
10c40 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
10c50 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
10c60 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
10c70 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70  );.  if( pgno!=p
10c80 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  Page->pgno ){.  
10c90 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
10ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10cb0 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
10cc0 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67     pPage->pDbPag
10cd0 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20  e = pDbPage;.   
10ce0 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
10cf0 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67  t;.    pPage->pg
10d00 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70  no = pgno;.    p
10d10 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
10d20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  = pgno==1 ? 100 
10d30 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  : 0;.  }.  asser
10d40 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d  t( pPage->aData=
10d50 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
10d60 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
10d70 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
10d80 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
10d90 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10da0 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
10db0 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
10dc0 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
10dd0 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
10de0 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20  if needed.  See 
10df0 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e  also: btreeGetUn
10e00 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  usedPage()..**.*
10e10 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47  * If the PAGER_G
10e20 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61  ET_NOCONTENT fla
10e30 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
10e40 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
10e50 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20  t care.** about 
10e60 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
10e70 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
10e80 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
10e90 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
10ea0 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
10eb0 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
10ec0 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
10ed0 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
10ee0 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
10ef0 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
10f00 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
10f10 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
10f20 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
10f30 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
10f40 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
10f50 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
10f60 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
10f70 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
10f80 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
10f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10fa0 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
10fb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
10fc0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
10fd0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
10fe0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
10ff0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
11000 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
11010 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
11020 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
11030 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
11040 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
11050 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
11060 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
11070 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41  _NOCONTENT or PA
11080 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
11090 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
110a0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
110b0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66  ge;..  assert( f
110c0 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
110d0 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ==PAGER_GET_NOCO
110e0 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d  NTENT || flags==
110f0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
11100 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LY );.  assert( 
11110 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11120 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11130 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11140 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
11150 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
11160 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
11170 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
11180 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11190 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
111a0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
111b0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
111c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
111d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
111e0 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
111f0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
11200 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
11210 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
11220 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
11230 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11240 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
11250 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
11260 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
11270 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
11280 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
11290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
112a0 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
112b0 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
112c0 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
112d0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
112e0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
112f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11300 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11310 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
11320 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
11330 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
11340 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
11350 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
11360 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
11370 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
11380 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
11390 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
113a0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
113b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
113c0 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
113d0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
113e0 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
113f0 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
11400 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
11410 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65  tatic Pgno btree
11420 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
11430 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ed *pBt){.  retu
11440 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  rn pBt->nPage;.}
11450 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65  .u32 sqlite3Btre
11460 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20  eLastPage(Btree 
11470 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
11480 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
11490 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
114a0 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e  sert( ((p->pBt->
114b0 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30  nPage)&0x8000000
114c0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
114d0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
114e0 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pBt);.}../*.*
114f0 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
11500 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
11510 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a  initialize it..*
11520 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20  *.** If pCur!=0 
11530 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  then the page is
11540 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61   being fetched a
11550 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65  s part of a move
11560 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c  ToChild().** cal
11570 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61  l.  Do additiona
11580 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
11590 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e  g on the page in
115a0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41   this case..** A
115b0 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20  nd if the fetch 
115c0 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74  fails, this rout
115d0 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65  ine must decreme
115e0 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a  nt pCur->iPage..
115f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69  **.** The page i
11600 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61  s fetched as rea
11610 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70  d-write unless p
11620 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Cur is not NULL 
11630 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64  and is.** a read
11640 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a  -only cursor..**
11650 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
11660 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70  occurs, then *pp
11670 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65  Page is undefine
11680 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d  d. It.** may rem
11690 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f  ain unchanged, o
116a0 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20  r it may be set 
116b0 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61  to an invalid va
116c0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
116d0 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
116e0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
116f0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
11700 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
11710 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
11720 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11740 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
11750 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
11760 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
11770 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11780 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
11790 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
117a0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
117b0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
117c0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
117d0 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61  o receive the pa
117e0 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ge, or NULL */. 
117f0 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20   int bReadOnly  
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
11820 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f  ead-only page */
11830 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
11840 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
11850 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11860 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11870 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11880 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
11890 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d  | ppPage==&pCur-
118a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
118b0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
118c0 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65  ( pCur==0 || bRe
118d0 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75  adOnly==pCur->cu
118e0 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20  rPagerFlags );. 
118f0 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
11900 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   || pCur->iPage>
11910 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  0 );..  if( pgno
11920 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
11930 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  pBt) ){.    rc =
11940 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11950 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67  BKPT;.    goto g
11960 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
11970 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ror;.  }.  rc = 
11980 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
11990 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
119a0 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
119b0 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79  bPage, bReadOnly
119c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
119d0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
119e0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
119f0 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d  }.  *ppPage = (M
11a00 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
11a10 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
11a20 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70  Page);.  if( (*p
11a30 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
11a40 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61  0 ){.    btreePa
11a50 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
11a60 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
11a70 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
11a80 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
11a90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11ab0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
11ac0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f  pPage);.      go
11ad0 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11ae0 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
11af0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
11b00 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
11b10 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
11b20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61  (*ppPage)->aData
11b30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
11b40 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
11b50 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69  ;..  /* If obtai
11b60 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67  ning a child pag
11b70 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20  e for a cursor, 
11b80 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74  we must verify t
11b90 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a  hat the page is.
11ba0 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20    ** compatible 
11bb0 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61  with the root pa
11bc0 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ge. */.  if( pCu
11bd0 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d  r && ((*ppPage)-
11be0 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70  >nCell<1 || (*pp
11bf0 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70  Page)->intKey!=p
11c00 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20  Cur->curIntKey) 
11c10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11c20 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
11c30 70 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61  pgno);.    relea
11c40 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11c50 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
11c60 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
11c70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11c80 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49  ITE_OK;..getAndI
11c90 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20  nitPage_error:. 
11ca0 20 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72   if( pCur ) pCur
11cb0 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73  ->iPage--;.  tes
11cc0 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
11cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
11ce0 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
11cf0 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
11d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11d10 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
11d20 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
11d30 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
11d40 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
11d50 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
11d60 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
11d70 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
11d80 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
11d90 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
11da0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
11db0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
11dc0 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
11dd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11de0 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
11df0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11e00 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
11e10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
11e20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
11e30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11e40 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
11e50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
11e60 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
11e70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11e80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
11e90 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
11ea0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11eb0 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
11ec0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
11ed0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
11ee0 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
11ef0 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
11f00 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
11f10 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
11f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
11f30 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a  n unused page..*
11f40 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
11f50 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47  just like btreeG
11f60 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68  etPage() with th
11f70 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a  e addition:.**.*
11f80 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61  *   *  If the pa
11f90 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
11fa0 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74   use for some ot
11fb0 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d  her purpose, imm
11fc0 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  ediately.**     
11fd0 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20   release it and 
11fe0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
11ff0 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a  _CURRUPT error..
12000 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72  **   *  Make sur
12010 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61  e the isInit fla
12020 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74  g is clear.*/.st
12030 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
12040 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42  tUnusedPage(.  B
12050 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
12060 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
12070 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
12080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12090 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
120a0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
120b0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
120c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
120d0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
120e0 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
120f0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
12100 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
12110 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
12120 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
12130 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
12140 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
12150 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
12160 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
12170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12180 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
12190 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
121a0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
121b0 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
121c0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
121d0 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
121e0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
121f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
12200 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
12210 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
12220 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
12230 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
12240 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
12250 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
12260 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
12270 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
12280 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
12290 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
122a0 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
122b0 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
122c0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
122d0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
122e0 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
122f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
12300 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
12310 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
12320 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
12330 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12340 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
12350 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
12360 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
12370 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
12380 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
12390 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
123a0 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
123b0 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
123c0 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
123d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
123e0 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
123f0 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
12400 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
12410 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12420 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
12430 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
12440 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
12450 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
12460 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12470 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
12480 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
12490 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
124a0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
124b0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
124c0 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
124d0 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
124e0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
124f0 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
12500 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
12510 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
12520 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
12530 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
12540 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
12550 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
12560 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
12570 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12580 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
12590 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
125a0 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
125b0 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
125c0 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
125d0 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
125e0 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
125f0 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
12600 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
12610 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
12620 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
12630 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
12640 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
12650 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
12660 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
12670 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
12680 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
12690 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
126a0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
126b0 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
126c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
126d0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
126e0 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
126f0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12700 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
12710 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
12720 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
12730 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12740 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
12750 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
12760 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
12770 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
12780 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
12790 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
127a0 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
127b0 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
127c0 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
127d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
127e0 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
127f0 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
12800 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
12810 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
12820 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
12830 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
12840 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
12850 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
12860 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
12870 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
12880 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
12890 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
128a0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
128b0 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
128c0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
128d0 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
128e0 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
128f0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
12900 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
12910 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
12920 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
12930 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
12940 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
12950 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
12960 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
12970 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
12980 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
12990 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
129a0 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
129b0 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
129c0 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
129d0 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
129e0 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
129f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
12a00 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
12a10 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
12a20 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
12a30 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
12a40 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
12a50 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
12a60 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
12a70 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
12a80 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
12a90 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
12aa0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
12ab0 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
12ac0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
12ad0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12ae0 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
12af0 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
12b00 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
12b10 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
12b20 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
12b30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
12b40 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
12b50 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
12b60 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
12b70 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
12b80 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
12b90 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
12ba0 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
12bb0 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
12bc0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
12bd0 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
12be0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12bf0 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
12c00 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
12c10 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
12c20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
12c30 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
12c40 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
12c50 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
12c60 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
12c70 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
12c80 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
12c90 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
12ca0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
12cb0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
12cc0 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
12cd0 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
12ce0 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
12cf0 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
12d00 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
12d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
12d20 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
12d30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
12d40 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
12d50 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
12d60 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
12d70 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
12d80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12d90 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
12da0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12db0 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
12dc0 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
12dd0 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
12de0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
12df0 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
12e00 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
12e10 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
12e20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
12e30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
12e40 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
12e50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
12e60 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
12e70 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
12e80 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
12e90 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
12ea0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
12eb0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
12ec0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
12ed0 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
12ee0 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
12ef0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12f00 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
12f10 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
12f20 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
12f30 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12f40 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
12f50 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
12f60 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
12f70 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
12f80 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
12f90 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
12fa0 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
12fb0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
12fc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
12fd0 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
12fe0 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
12ff0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
13000 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
13010 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
13020 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
13030 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
13040 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
13050 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
13060 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13070 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
13080 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13090 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
130a0 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
130b0 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
130c0 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
130d0 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
130e0 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
130f0 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
13100 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
13110 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
13120 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
13130 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
13140 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
13150 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
13160 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
13170 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
13180 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
13190 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
131a0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
131b0 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
131c0 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
131d0 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
131e0 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
131f0 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
13200 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
13210 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
13220 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
13230 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
13240 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
13250 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
13260 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
13270 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
13280 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
13290 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
132a0 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
132b0 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
132c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
132d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
132e0 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
132f0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
13300 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
13310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13320 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
13330 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
13340 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
13350 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
13360 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13370 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13380 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
13390 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
133a0 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
133b0 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
133c0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
133d0 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
133e0 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
133f0 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
13400 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
13410 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
13420 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
13430 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
13440 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
13450 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
13460 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
13470 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
13480 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
13490 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
134a0 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
134b0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
134c0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
134d0 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
134e0 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
134f0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
13500 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
13510 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
13520 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
13530 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
13540 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
13550 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
13560 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
13570 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
13580 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
13590 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
135a0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
135b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
135c0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
135d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
135e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
135f0 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
13600 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
13610 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
13620 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
13630 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
13640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
13650 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
13660 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
13670 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
136a0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
136b0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
136c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
136d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
136e0 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
136f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
13700 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13710 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13720 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
13730 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
13740 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
13750 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
13760 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
13770 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
13780 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
13790 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
137a0 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
137b0 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
137c0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
137d0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
137e0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
137f0 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
13800 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
13810 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
13820 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
13830 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
13840 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13850 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
13860 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
13870 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13880 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
13890 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
138a0 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
138b0 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
138c0 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
138d0 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
138f0 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
13900 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
13910 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
13920 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
13930 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
13940 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
13950 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
13960 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
13970 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
13980 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
13990 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
139a0 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
139b0 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
139c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
139d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
139e0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
139f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13a00 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
13a10 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
13a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13a30 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
13a40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
13a50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13a80 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
13a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13aa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
13ab0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
13ac0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
13ad0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
13ae0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
13af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13b00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13b10 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
13b20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13b30 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13b40 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
13b50 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
13b60 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
13b70 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
13b80 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
13b90 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
13ba0 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
13bb0 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
13bc0 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
13bd0 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
13be0 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
13bf0 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
13c00 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
13c10 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
13c20 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13c30 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
13c40 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
13c50 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
13c60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13c70 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
13c80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
13c90 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
13ca0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
13cb0 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
13cc0 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
13cd0 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
13ce0 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
13cf0 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
13d00 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
13d10 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
13d20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
13d30 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
13d40 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
13d50 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
13d60 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
13d70 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
13d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13d90 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
13da0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13db0 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
13dc0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13dd0 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
13de0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
13df0 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
13e00 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
13e10 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
13e20 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
13e30 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
13e40 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
13e50 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
13e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13e70 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
13e80 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
13e90 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
13ea0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
13eb0 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
13ec0 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
13ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
13ef0 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61  of(MemPage), fla
13f00 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
13f10 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
13f20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13f30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13f40 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
13f50 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
13f60 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
13f70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13f80 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
13f90 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
13fa0 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
13fb0 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
13fc0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
13fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13fe0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
13ff0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
14000 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
14010 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
14020 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
14030 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
14040 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
14050 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
14060 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
14070 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
14080 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
14090 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
140a0 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
140b0 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
140c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
140d0 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
140e0 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
140f0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
14100 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  _ONLY;.#ifdef SQ
14110 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
14120 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  TE.    pBt->btsF
14130 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
14140 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  RE_DELETE;.#endi
14150 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  f.    /* EVIDENC
14160 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
14170 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
14180 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
14190 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
141a0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
141b0 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
141c0 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
141d0 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
141e0 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
141f0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
14200 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14210 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61  . */.    pBt->pa
14220 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61  geSize = (zDbHea
14230 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a  der[16]<<8) | (z
14240 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36  DbHeader[17]<<16
14250 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
14260 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
14270 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
14280 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
14290 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
142a0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
142b0 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
142c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
142d0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
142e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
142f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14300 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
14310 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
14320 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
14330 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
14340 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
14350 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
14360 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
14370 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
14380 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
14390 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
143a0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
143b0 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
143c0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
143d0 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
143e0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
143f0 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
14400 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
14410 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
14420 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
14430 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
14440 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
14450 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
14460 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
14470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
14480 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
14490 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
144a0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
144b0 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
144c0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
144d0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
144e0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
144f0 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
14500 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
14510 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
14520 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
14530 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
14540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14550 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
14560 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
14570 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
14580 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
14590 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  .      ** determ
145a0 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
145b0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
145c0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
145d0 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
145e0 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
145f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
14600 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eader. */.      
14610 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
14620 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
14630 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14640 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
14650 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
14660 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
14670 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
14680 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
14690 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
146a0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
146b0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
146c0 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
146d0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
146e0 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
146f0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
14700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14710 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
14720 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
14730 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
14740 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
14750 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
14760 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
14770 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
14780 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
14790 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
147a0 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
147b0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
147c0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
147d0 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
147e0 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
147f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14800 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
14810 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14820 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
14830 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
14840 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
14850 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
14860 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
14870 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
14880 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
14890 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
148a0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
148b0 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
148c0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
148d0 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d  hared; ).      M
148e0 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
148f0 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
14900 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14910 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14920 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
14930 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14940 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
14950 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
14960 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
14970 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
14980 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
14990 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
149a0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
149b0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
149c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
149d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
149e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
149f0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
14a00 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
14a10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14a20 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14a30 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14a40 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
14a50 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14a60 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14a70 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
14a80 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14a90 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14aa0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
14ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14ac0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14ad0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
14ae0 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
14af0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14b00 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14b10 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14b20 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14b30 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
14b40 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
14b50 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
14b60 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
14b70 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
14b80 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
14b90 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
14ba0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
14bb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
14bc0 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
14bd0 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
14be0 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
14bf0 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
14c00 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14c10 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14c20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14c30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14c40 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14c50 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
14c60 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
14c70 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
14c80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
14c90 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
14ca0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
14cb0 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
14cc0 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42   if( (uptr)p->pB
14cd0 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42  t<(uptr)pSib->pB
14ce0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
14cf0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
14d00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
14d10 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
14d20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
14d30 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14d40 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
14d50 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
14d60 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e  & (uptr)pSib->pN
14d70 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  ext->pBt<(uptr)p
14d80 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
14d90 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
14da0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14db0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14dc0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
14dd0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14de0 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14df0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14e00 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14e10 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14e20 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14e40 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
14e50 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
14e60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
14e80 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
14e90 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
14ea0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
14eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14ec0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
14ed0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14ee0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14ef0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
14f00 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
14f10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
14f20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14f30 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
14f40 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
14f50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
14f60 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20  le *pFile;..    
14f70 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
14f80 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
14f90 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
14fa0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
14fb0 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
14fc0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
14fd0 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
14fe0 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
14ff0 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
15000 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
15010 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
15020 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
15030 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
15040 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
15050 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
15060 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15070 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
15080 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
15090 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
150a0 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
150b0 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20     }..    pFile 
150c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
150d0 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  le(pBt->pPager);
150e0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
150f0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
15100 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
15110 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65  ontrolHint(pFile
15120 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
15130 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d  DB, (void*)&pBt-
15140 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >db);.    }.  }.
15150 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
15160 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
15170 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15180 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
15190 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
151a0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
151b0 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  n);.  }.  assert
151c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
151d0 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  || sqlite3BtreeC
151e0 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a  onnectionCount(*
151f0 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20  ppBtree)>0 );.  
15200 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15210 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
15220 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
15230 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
15240 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
15250 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
15260 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
15270 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
15280 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
15290 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
152a0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
152b0 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
152c0 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
152d0 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
152e0 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
152f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
15300 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
15310 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
15320 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
15330 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15340 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  CHE.  MUTEX_LOGI
15350 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
15360 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42   *pMaster; ).  B
15370 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
15380 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
15390 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
153a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
153b0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
153c0 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  );.  MUTEX_LOGIC
153d0 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
153e0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
153f0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
15400 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
15410 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15420 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
15430 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
15440 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
15450 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
15460 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15470 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15480 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
15490 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
154a0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
154b0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
154c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
154d0 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
154e0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
154f0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15500 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
15510 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
15520 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
15530 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
15540 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
15550 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
15560 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
15570 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
15580 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
15590 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
155a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
155b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
155c0 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
155d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
155e0 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
155f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
15600 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
15610 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15620 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
15630 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
15640 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
15650 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15660 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
15670 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
15680 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
15690 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
156a0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20  SIZE(pBt) bytes 
156b0 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72  with a 4-byte pr
156c0 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d  efix for a left-
156d0 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72  child.** pointer
156e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
156f0 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
15700 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
15710 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
15720 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
15730 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
15740 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
15750 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
15760 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
15770 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
15780 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
15790 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
157a0 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
157b0 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
157c0 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
157d0 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
157e0 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
157f0 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
15800 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
15810 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
15820 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
15830 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
15840 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
15850 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
15860 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
15870 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
15880 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
15890 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
158a0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
158b0 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
158c0 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
158d0 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
158e0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
158f0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
15900 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
15910 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
15920 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
15930 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
15940 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
15950 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
15960 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
15970 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
15980 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
15990 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
159a0 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
159b0 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
159c0 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
159d0 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
159e0 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
159f0 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
15a00 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a  ce here..    **.
15a10 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72      ** Also:  Pr
15a20 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73  ovide four bytes
15a30 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
15a40 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65  space before the
15a50 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e  .    ** beginnin
15a60 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61  g of pTmpSpace a
15a70 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61  s an area availa
15a80 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74  ble to prepend t
15a90 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63  he.    ** left-c
15aa0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  hild pointer to 
15ab0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15ac0 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a   a cell..    */.
15ad0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
15ae0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
15af0 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
15b00 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20  Space, 0, 8);.  
15b10 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15b20 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ce += 4;.    }. 
15b30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
15b40 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
15b50 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
15b60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
15b70 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
15b80 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15b90 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
15ba0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
15bb0 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20  pSpace -= 4;.   
15bc0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
15bd0 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29  (pBt->pTmpSpace)
15be0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  ;.    pBt->pTmpS
15bf0 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pace = 0;.  }.}.
15c00 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
15c10 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
15c20 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
15c30 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
15c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15c50 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
15c60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15c70 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
15c80 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
15c90 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
15ca0 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
15cb0 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
15cc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15cd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15ce0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15cf0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15d00 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
15d10 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
15d20 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
15d30 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
15d40 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
15d50 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
15d60 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
15d70 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
15d80 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
15d90 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
15da0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
15db0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
15dc0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
15dd0 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
15de0 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
15df0 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
15e00 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
15e10 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
15e20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
15e30 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
15e40 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
15e50 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15e60 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  k(p, SQLITE_OK, 
15e70 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  0);.  sqlite3Btr
15e80 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
15e90 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
15ea0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
15eb0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
15ec0 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
15ed0 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
15ee0 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
15ef0 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
15f00 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
15f10 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
15f20 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
15f30 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
15f40 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15f50 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
15f60 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
15f70 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
15f80 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
15f90 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
15fa0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
15fb0 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
15fc0 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
15fd0 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
15fe0 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
15ff0 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
16000 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
16010 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
16020 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
16030 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
16040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
16050 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
16060 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
16070 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
16080 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a  pPager, p->db);.
16090 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
160a0 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
160b0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
160c0 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
160d0 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
160e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
160f0 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
16100 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
16110 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
16120 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
16130 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
16140 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16150 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
16160 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
16170 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
16180 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
16190 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
161a0 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
161b0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
161c0 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
161d0 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
161e0 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
161f0 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
16200 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
16210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
16230 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d  e the "soft" lim
16240 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
16250 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
16260 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65   cache..** Unuse
16270 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64  d and unmodified
16280 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72   pages will be r
16290 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65  ecycled when the
162a0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
162b0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
162c0 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f   exceeds this so
162d0 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74  ft limit.  But t
162e0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
162f0 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77  * cache is allow
16300 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65  ed to grow large
16310 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69  r than this limi
16320 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  t if it contains
16330 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20  .** dirty pages 
16340 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69  or pages still i
16350 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f  n active use..*/
16360 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16370 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
16380 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
16390 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
163a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
163b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
163c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
163d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
163e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
163f0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16400 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16410 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
16420 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
16430 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
16460 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69  e the "spill" li
16470 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
16480 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
16490 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74  e cache..** If t
164a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
164b0 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20  es exceeds this 
164c0 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77  limit during a w
164d0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
164e0 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d  ,.** the pager m
164f0 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20  ight attempt to 
16500 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f  "spill" pages to
16510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72   the journal ear
16520 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74  ly in.** order t
16530 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79  o free up memory
16540 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
16550 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
16560 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
16570 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69  size.  If zero i
16580 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61  s passed.** as a
16590 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63  n argument, no c
165a0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
165b0 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a  to the spill siz
165c0 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a  e setting, so.**
165d0 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66   using mxPage of
165e0 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71   0 is a way to q
165f0 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74  uery the current
16600 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a   spill size..*/.
16610 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16620 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72  SetSpillSize(Btr
16630 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16640 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
16650 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16660 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
16670 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16680 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16690 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
166a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
166b0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61   res = sqlite3Pa
166c0 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  gerSetSpillsize(
166d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
166e0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
166f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16700 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23  return res;.}..#
16710 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
16720 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
16730 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
16740 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
16750 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16760 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ile that may be.
16770 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ** memory mapped
16780 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16790 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
167a0 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69  t(Btree *p, sqli
167b0 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
167c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
167d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
167e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
167f0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16800 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16810 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16820 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16830 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
16840 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61  t->pPager, szMma
16850 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
16860 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16880 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16890 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
168a0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  >0 */../*.** Cha
168b0 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
168c0 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
168d0 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
168e0 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
168f0 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
16900 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
16910 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
16920 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
16930 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
16940 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
16950 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
16960 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
16970 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
16980 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
16990 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
169a0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
169b0 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
169c0 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
169d0 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
169e0 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
169f0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
16a00 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
16a10 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
16a20 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
16a30 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
16a40 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
16a50 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
16a60 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16a70 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
16a80 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
16a90 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
16aa0 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70  lags(.  Btree *p
16ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16ac0 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73  * The btree to s
16ad0 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65  et the safety le
16ae0 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  vel on */.  unsi
16af0 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
16b00 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41     /* Various PA
16b10 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  GER_* flags */.)
16b20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16b30 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16b40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16b50 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16b60 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16b70 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16b80 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16b90 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
16ba0 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a  ager, pgFlags);.
16bb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16bc0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
16be0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
16bf0 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
16c00 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
16c10 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16c20 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
16c30 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
16c40 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
16c50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
16c60 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
16c70 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
16c80 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
16c90 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
16ca0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
16cb0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
16cc0 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
16cd0 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
16ce0 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
16cf0 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
16d00 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
16d10 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
16d20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
16d30 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
16d40 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
16d50 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
16d60 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
16d70 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
16d80 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
16d90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
16da0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
16db0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
16dc0 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
16dd0 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
16de0 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
16df0 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
16e00 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
16e10 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
16e20 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
16e30 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
16e40 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
16e50 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
16e60 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16e70 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
16e80 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
16e90 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
16ea0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
16eb0 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
16ec0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
16ed0 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
16ee0 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
16ef0 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
16f00 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
16f10 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
16f20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16f30 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
16f40 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
16f50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
16f60 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
16f70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16f80 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
16f90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
16fb0 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
16fc0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
16fd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16fe0 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
16ff0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
17000 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
17010 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
17020 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17030 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
17040 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
17050 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17060 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
17070 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
17080 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
170a0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
170b0 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
170c0 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
170d0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
170e0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
170f0 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
17100 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
17110 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
17120 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
17130 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
17140 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
17150 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
17160 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
17170 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
17180 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
17190 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
171a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
171b0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
171c0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
171d0 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
171e0 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
171f0 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
17200 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17210 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
17220 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
17230 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
17240 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
17250 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
17260 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
17270 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
17280 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
17290 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
172a0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
172b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
172c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
172d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
172e0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
172f0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
17300 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17310 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
17320 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
17330 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
17340 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
17350 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
17360 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
17370 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
17380 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
17390 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
173a0 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
173b0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
173c0 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
173d0 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
173e0 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
173f0 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
17400 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
17410 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
17420 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
17430 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
17440 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
17450 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
17460 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
17470 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
17480 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
17490 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
174a0 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
174b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
174c0 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
174d0 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
174e0 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
174f0 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
17500 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
17510 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
17520 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
17530 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
17540 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
17550 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17560 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
17570 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
17580 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17590 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
175a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
175b0 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
175c0 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
175d0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
175e0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
175f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
17600 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17610 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17620 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
17630 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
17640 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
17650 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
17660 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
17670 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
17680 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
17690 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
176a0 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
176b0 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
176c0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
176d0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
176e0 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
176f0 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
17700 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
17710 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
17720 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
17730 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
17740 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
17750 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
17760 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
17770 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17780 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
17790 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
177a0 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
177b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
177c0 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
177d0 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
177e0 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
177f0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17800 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
17810 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17820 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
17830 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17840 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
17850 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
17860 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
17870 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
17880 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
17890 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
178a0 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
178b0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
178c0 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
178d0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
178e0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
178f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17900 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
17910 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17920 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
17930 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17940 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
17950 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
17960 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
17970 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
17980 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17990 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
179a0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
179b0 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
179c0 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
179d0 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
179e0 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
179f0 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
17a00 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
17a10 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
17a20 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
17a30 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17a40 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
17a50 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
17a60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17a70 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
17a80 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
17a90 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
17aa0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
17ab0 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
17ac0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17ad0 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
17ae0 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
17af0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
17b00 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
17b10 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
17b20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17b30 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
17b40 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
17b50 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
17b60 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
17b70 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
17b80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17b90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
17ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
17bb0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
17bc0 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
17bd0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
17be0 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
17bf0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
17c00 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
17c10 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
17c20 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
17c30 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
17c40 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
17c50 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
17c60 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
17c70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
17c80 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
17c90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17ca0 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
17cb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17cc0 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
17cd0 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
17ce0 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
17cf0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
17d00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
17d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17d20 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
17d30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17d40 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
17d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
17d60 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
17d70 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
17d80 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17d90 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
17da0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
17db0 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
17dc0 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
17dd0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
17de0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
17df0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
17e00 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
17e10 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
17e20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
17e30 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
17e40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
17e50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17e60 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
17e70 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
17e80 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
17e90 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
17ea0 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
17eb0 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
17ec0 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
17ed0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
17ee0 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
17ef0 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
17f00 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
17f10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
17f20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
17f30 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
17f40 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
17f50 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
17f60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17f70 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
17f80 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
17f90 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
17fa0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
17fb0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
17fc0 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
17fd0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
17fe0 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
17ff0 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
18000 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18010 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18020 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
18030 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  /*.** If the use
18040 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68  r has not set th
18050 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66  e safety-level f
18060 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
18070 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75   connection.** u
18080 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e  sing "PRAGMA syn
18090 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69  chronous", and i
180a0 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  f the safety-lev
180b0 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  el is not alread
180c0 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20  y.** set to the 
180d0 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  value passed to 
180e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
180f0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
18100 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74  meter,.** set it
18110 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49   so..*/.#if SQLI
18120 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
18130 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44  RONOUS!=SQLITE_D
18140 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
18150 52 4f 4e 4f 55 53 0a 73 74 61 74 69 63 20 76 6f  RONOUS.static vo
18160 69 64 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e  id setDefaultSyn
18170 63 46 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a  cFlag(BtShared *
18180 70 42 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c  pBt, u8 safety_l
18190 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  evel){.  sqlite3
181a0 20 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b   *db;.  Db *pDb;
181b0 0a 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e  .  if( (db=pBt->
181c0 64 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64  db)!=0 && (pDb=d
181d0 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20  b->aDb)!=0 ){.  
181e0 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42    while( pDb->pB
181f0 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74  t==0 || pDb->pBt
18200 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44  ->pBt!=pBt ){ pD
18210 62 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70  b++; }.    if( p
18220 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20  Db->bSyncSet==0 
18230 0a 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61  .     && pDb->sa
18240 66 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65  fety_level!=safe
18250 74 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26  ty_level .     &
18260 26 20 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b  & pDb!=&db->aDb[
18270 31 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  1] .    ){.     
18280 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76   pDb->safety_lev
18290 65 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65  el = safety_leve
182a0 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
182b0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
182c0 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20  t->pPager,.     
182d0 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
182e0 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c  _level | (db->fl
182f0 61 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47  ags & PAGER_FLAG
18300 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a  S_MASK));.    }.
18310 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
18320 66 69 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53  fine setDefaultS
18330 79 6e 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65  yncFlag(pBt,safe
18340 74 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66  ty_level).#endif
18350 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
18360 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
18370 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
18380 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
18390 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
183a0 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
183b0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
183c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
183d0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
183e0 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
183f0 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
18400 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
18410 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
18420 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
18430 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
18440 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
18450 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
18460 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
18470 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
18480 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
18490 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
184a0 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
184b0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
184c0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
184d0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
184e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
184f0 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
18500 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  tions */.  MemPa
18510 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
18520 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65  /* Page 1 of the
18530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
18540 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
18550 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18560 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
18570 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
18580 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d   int nPageFile =
18590 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
185a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
185b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
185c0 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64  .  int nPageHead
185d0 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  er;     /* Numbe
185e0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
185f0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72  e database accor
18600 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a  ding to hdr */..
18610 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18620 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
18630 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
18640 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
18650 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
18660 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
18670 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
18680 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
18690 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
186a0 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
186b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
186c0 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
186d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
186e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
186f0 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
18700 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
18710 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
18720 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
18730 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
18740 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
18750 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50   */.  nPage = nP
18760 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34  ageHeader = get4
18770 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
18780 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73  ge1->aData);.  s
18790 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
187a0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
187b0 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  , &nPageFile);. 
187c0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
187d0 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
187e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
187f0 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
18800 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
18810 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
18820 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ile;.  }.  if( n
18830 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
18840 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
18850 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
18860 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
18870 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
18880 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18890 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
188a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
188b0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
188c0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
188d0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
188e0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
188f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
18900 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
18910 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
18920 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
18930 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
18940 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
18950 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
18960 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
18970 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
18980 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18990 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
189a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
189b0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
189c0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
189d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
189e0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
189f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
18a00 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
18a10 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18a20 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18a30 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
18a40 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
18a50 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
18a60 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
18a70 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
18a80 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
18a90 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18aa0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18ab0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
18ac0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
18ad0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
18ae0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
18af0 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
18b00 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
18b10 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
18b20 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
18b30 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
18b40 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
18b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
18b60 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
18b70 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
18b80 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
18b90 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
18ba0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
18bb0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
18bc0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
18bd0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
18be0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
18bf0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
18c00 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
18c10 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
18c20 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
18c30 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
18c40 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
18c50 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
18c60 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
18c70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
18c80 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
18c90 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
18ca0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
18cb0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
18cc0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
18cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18ce0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
18cf0 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
18d00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18d10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18d20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18d30 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18d50 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
18d60 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
18d70 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
18d80 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
18d90 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
18da0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
18db0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
18dc0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  1);.          re
18dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18df0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
18e00 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
18e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74  }else{.      set
18e20 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
18e30 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  pBt, SQLITE_DEFA
18e40 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b  ULT_SYNCHRONOUS+
18e50 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
18e60 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
18e70 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
18e80 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
18e90 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
18ea0 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
18eb0 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
18ec0 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
18ed0 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
18ee0 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
18ef0 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
18f00 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
18f10 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
18f20 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
18f30 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
18f40 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
18f50 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
18f60 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
18f70 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
18f80 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
18f90 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
18fa0 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
18fb0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18fc0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
18fd0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
18fe0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
18ff0 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
19000 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
19010 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
19020 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
19030 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
19040 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
19050 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
19060 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
19070 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
19080 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19090 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
190a0 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
190b0 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
190c0 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
190d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
190e0 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
190f0 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
19100 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
19110 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
19120 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
19130 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
19140 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
19150 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
19160 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
19170 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
19180 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
19190 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
191a0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
191b0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
191c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
191d0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
191e0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
191f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19200 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
19210 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
19220 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
19230 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
19240 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
19250 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19260 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
19270 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
19280 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
19290 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
192a0 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
192b0 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
192c0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
192d0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
192e0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
192f0 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
19300 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
19310 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
19320 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
19330 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
19340 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
19350 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19360 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
19370 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
19380 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
19390 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
193a0 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
193b0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
193c0 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
193d0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
193e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
193f0 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
19400 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
19410 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
19420 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
19430 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
19440 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
19450 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
19460 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
19470 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
19480 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
19490 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
194a0 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
194b0 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
194c0 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
194d0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
194e0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
194f0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
19500 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
19510 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
19520 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
19530 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
19540 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
19550 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
19560 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
19570 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
19580 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
19590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
195a0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
195b0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
195c0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
195f0 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
19600 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19620 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
19630 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  & SQLITE_WriteSc
19640 68 65 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61 67  hema)==0 && nPag
19650 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20  e>nPageFile ){. 
19660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19670 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
19680 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
19690 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
196a0 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
196b0 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36  CE-OF: R-28312-6
196c0 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68  4704 However, th
196d0 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73  e usable size is
196e0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a   not allowed to.
196f0 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74      ** be less t
19700 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65  han 480. In othe
19710 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
19720 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32  page size is 512
19730 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
19740 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  * reserved space
19750 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63   size cannot exc
19760 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69  eed 32. */.    i
19770 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38  f( usableSize<48
19780 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
19790 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
197a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  d;.    }.    pBt
197b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
197c0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
197d0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
197e0 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
197f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19800 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
19810 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
19820 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
19830 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
19840 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
19850 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
19860 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
19870 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
19880 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
19890 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
198a0 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
198b0 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
198c0 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
198d0 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
198e0 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
198f0 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
19900 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
19910 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
19920 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
19930 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
19940 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
19950 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
19960 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
19970 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
19980 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
19990 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
199a0 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
199b0 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
199c0 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
199d0 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
199e0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
199f0 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
19a00 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
19a10 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
19a20 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
19a30 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
19a40 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20  2-byte pointer, 
19a50 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
19a60 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
19a70 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
19a80 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
19a90 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
19aa0 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
19ab0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
19ac0 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
19ad0 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
19ae0 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
19af0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
19b00 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  4/255 - 23);.  p
19b10 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
19b20 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
19b30 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
19b40 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
19b50 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70  axLeaf = (u16)(p
19b60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
19b70 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   35);.  pBt->min
19b80 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42  Leaf = (u16)((pB
19b90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
19ba0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
19bb0 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f    if( pBt->maxLo
19bc0 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70  cal>127 ){.    p
19bd0 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
19be0 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c  oad = 127;.  }el
19bf0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  se{.    pBt->max
19c00 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28  1bytePayload = (
19c10 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  u8)pBt->maxLocal
19c20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19c30 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
19c40 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
19c50 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
19c60 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
19c70 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
19c80 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
19c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
19ca0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
19cb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19cc0 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
19cd0 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
19ce0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
19cf0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
19d00 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
19d10 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   of cursors open
19d20 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73   on pBt. This is
19d30 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
19d40 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
19d50 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
19d60 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
19d70 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
19d80 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  defined..**.** O
19d90 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
19da0 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66  s are counted if
19db0 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e   wrOnly is true.
19dc0 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a    If wrOnly is.*
19dd0 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c  * false then all
19de0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
19df0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  nted..**.** For 
19e00 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
19e10 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
19e20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
19e30 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
19e40 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
19e50 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  ng or writing to
19e60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19e70 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20  Cursors that.** 
19e80 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65  have been trippe
19e90 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f  d into the CURSO
19ea0 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72  R_FAULT state ar
19eb0 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a  e not counted..*
19ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
19ed0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42  ntValidCursors(B
19ee0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
19ef0 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  t wrOnly){.  BtC
19f00 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
19f10 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
19f20 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
19f30 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
19f40 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
19f50 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c  if( (wrOnly==0 |
19f60 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  | (pCur->curFlag
19f70 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
19f80 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  ag)!=0).     && 
19f90 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
19fa0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
19fb0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
19fc0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
19fd0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
19fe0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
19ff0 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
1a000 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
1a010 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
1a020 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
1a030 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
1a040 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a050 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1a060 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
1a070 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1a080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a090 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
1a0a0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
1a0b0 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
1a0c0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
1a0d0 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
1a0e0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1a0f0 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
1a100 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1a110 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1a120 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1a130 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1a140 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a150 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1a160 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1a170 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1a180 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
1a190 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
1a1a0 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
1a1b0 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
1a1c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a1d0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
1a1e0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
1a1f0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1a200 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1a210 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1a220 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1a230 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1a240 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1a250 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
1a260 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   );.    pBt->pPa
1a270 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ge1 = 0;.    rel
1a280 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
1a290 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPage1);.  }.}..
1a2a0 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
1a2b0 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
1a2c0 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
1a2d0 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
1a2e0 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
1a2f0 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
1a300 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
1a310 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1a320 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1a330 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a340 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
1a350 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
1a360 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
1a370 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
1a380 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
1a390 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a3a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a3b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
1a3c0 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
1a3d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a3e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
1a3f0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1a400 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
1a410 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
1a420 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
1a430 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1a440 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
1a450 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1a460 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
1a470 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
1a480 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
1a490 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
1a4a0 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
1a4b0 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
1a4c0 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
1a4d0 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
1a4e0 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
1a4f0 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
1a500 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
1a510 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1a520 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
1a530 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
1a540 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
1a550 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
1a560 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
1a570 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
1a580 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
1a590 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
1a5a0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
1a5b0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
1a5c0 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
1a5d0 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
1a5e0 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
1a5f0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
1a600 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
1a610 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
1a620 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
1a630 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
1a640 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
1a650 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
1a660 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
1a670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a680 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
1a690 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
1a6a0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1a6b0 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
1a6c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a6d0 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
1a6e0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1a6f0 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
1a700 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
1a710 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
1a720 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
1a730 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
1a740 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1a750 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
1a760 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
1a770 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
1a780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a790 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1a7a0 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
1a7b0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1a7c0 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
1a7d0 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
1a7e0 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
1a7f0 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
1a800 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
1a810 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
1a820 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
1a830 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
1a840 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
1a850 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
1a860 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
1a870 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
1a880 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1a890 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1a8a0 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
1a8b0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
1a8c0 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
1a8d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1a8e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1a8f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1a900 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
1a910 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1a920 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
1a930 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
1a940 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
1a950 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
1a960 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
1a970 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
1a980 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
1a990 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a9a0 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
1a9b0 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
1a9c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1a9d0 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
1a9e0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
1a9f0 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
1aa00 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
1aa10 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
1aa20 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
1aa30 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
1aa40 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
1aa50 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
1aa60 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1aa70 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
1aa80 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
1aa90 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
1aaa0 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
1aab0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1aac0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1aad0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
1aae0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
1aaf0 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
1ab00 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1ab10 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
1ab20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ab30 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
1ab40 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
1ab50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ab60 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
1ab70 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
1ab80 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
1ab90 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1aba0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
1abb0 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
1abc0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
1abd0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1abe0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
1abf0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1ac00 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
1ac10 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
1ac20 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
1ac30 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1ac40 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
1ac50 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
1ac60 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
1ac70 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
1ac80 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
1ac90 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
1aca0 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
1acb0 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
1acc0 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
1acd0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
1ace0 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
1acf0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
1ad00 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
1ad10 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
1ad20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
1ad30 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
1ad40 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
1ad50 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
1ad60 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
1ad70 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
1ad80 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
1ad90 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
1ada0 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
1adb0 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
1adc0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
1add0 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
1ade0 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
1adf0 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
1ae00 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
1ae10 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
1ae20 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
1ae30 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
1ae40 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
1ae50 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
1ae60 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
1ae70 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
1ae80 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
1ae90 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
1aea0 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
1aeb0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
1aec0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1aed0 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
1aee0 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
1aef0 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
1af00 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
1af10 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
1af20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
1af30 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
1af40 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
1af50 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
1af60 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
1af70 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
1af80 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
1af90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1afa0 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
1afb0 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
1afc0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1afd0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
1afe0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1aff0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
1b000 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1b010 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1b020 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
1b030 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
1b040 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
1b050 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
1b060 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
1b070 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1b080 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
1b090 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
1b0a0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
1b0b0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
1b0c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1b0d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1b0e0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
1b0f0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
1b100 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
1b110 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1b120 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b130 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b140 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
1b150 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
1b160 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
1b170 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1b180 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1b190 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1b1a0 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1b1b0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1b1c0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1b1d0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1b1e0 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1b1f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1b200 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1b210 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1b220 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1b230 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1b240 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1b250 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1b260 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1b270 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1b280 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1b290 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1b2a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1b2b0 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1b2c0 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1b2d0 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1b2e0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1b2f0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1b300 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1b310 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1b320 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1b330 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1b340 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1b350 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1b360 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1b370 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1b380 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1b390 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1b3a0 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1b3b0 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1b3c0 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1b3d0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1b3e0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1b3f0 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1b400 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1b410 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1b420 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1b430 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1b440 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1b450 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1b460 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b470 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b480 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1b490 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1b4a0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1b4b0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1b4c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b4d0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1b4e0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1b4f0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b500 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1b510 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1b520 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1b530 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1b540 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1b550 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1b560 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1b570 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1b580 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1b590 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1b5a0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1b5b0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1b5c0 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1b5d0 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1b5e0 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1b5f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1b600 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1b610 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1b620 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1b630 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1b640 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1b650 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1b660 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1b670 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1b680 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1b690 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1b6a0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1b6b0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1b6c0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1b6d0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1b6e0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1b6f0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1b700 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1b710 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1b720 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1b730 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1b740 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1b750 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1b760 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1b770 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1b780 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1b790 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1b7a0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1b7b0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1b7c0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1b7d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1b7e0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1b7f0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1b800 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1b810 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1b820 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1b830 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1b840 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1b850 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1b860 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1b870 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1b880 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1b890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b8a0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1b8b0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1b8c0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1b8d0 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1b8e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1b8f0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1b900 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1b910 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1b920 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
1b930 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
1b940 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
1b950 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
1b960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1b980 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1b990 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1b9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1b9b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b9c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
1b9d0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1b9e0 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
1b9f0 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
1ba00 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
1ba10 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1ba20 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1ba30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
1ba40 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
1ba50 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
1ba60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ba70 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
1ba80 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1ba90 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
1baa0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
1bab0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1bac0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1bad0 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
1bae0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1baf0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
1bb00 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
1bb10 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
1bb20 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
1bb30 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
1bb40 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
1bb50 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
1bb60 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1bb70 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
1bb80 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
1bb90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1bba0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1bbb0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
1bbc0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
1bbd0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
1bbe0 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
1bbf0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1bc00 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1bc10 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
1bc20 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
1bc30 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1bc40 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1bc50 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1bc60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bc70 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1bc80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1bc90 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
1bca0 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
1bcb0 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
1bcc0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1bcd0 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
1bce0 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
1bcf0 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
1bd00 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
1bd10 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
1bd20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
1bd30 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
1bd40 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
1bd50 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
1bd60 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
1bd70 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
1bd80 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1bd90 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
1bda0 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
1bdb0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
1bdc0 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
1bdd0 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
1bde0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
1bdf0 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
1be00 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
1be10 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
1be20 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
1be30 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
1be40 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
1be50 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1be60 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
1be70 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1be80 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1be90 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
1bea0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1beb0 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
1bec0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1bed0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1bee0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1bef0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bf00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1bf10 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1bf20 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1bf30 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1bf40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bf50 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
1bf60 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1bf70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1bf80 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
1bf90 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
1bfa0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
1bfb0 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
1bfc0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
1bfd0 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
1bfe0 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
1bff0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
1c000 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
1c010 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
1c020 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1c030 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1c040 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1c050 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
1c060 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c070 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1c080 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1c090 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
1c0a0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
1c0b0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
1c0c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c0d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1c0e0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1c0f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1c100 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
1c110 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1c120 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1c130 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
1c140 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
1c150 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
1c160 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
1c170 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1c180 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
1c190 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
1c1a0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
1c1b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1c1c0 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
1c1d0 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
1c1e0 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
1c1f0 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1c220 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
1c230 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c260 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
1c270 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
1c280 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c2b0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1c2c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1c2d0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1c2e0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
1c2f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1c300 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1c310 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1c320 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49   rc = pPage->isI
1c330 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nit ? SQLITE_OK 
1c340 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  : btreeInitPage(
1c350 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1c360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1c370 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c  turn rc;.  nCell
1c380 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1c390 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
1c3a0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1c3b0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1c3c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1c3d0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
1c3e0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
1c3f0 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
1c400 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1c410 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
1c420 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1c430 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
1c440 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1c450 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1c460 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1c470 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1c480 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1c490 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
1c4a0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1c4b0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1c4c0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1c4d0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
1c4e0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1c4f0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1c500 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1c510 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
1c530 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
1c540 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1c550 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
1c560 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
1c570 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
1c580 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
1c590 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
1c5a0 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
1c5b0 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
1c5c0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
1c5d0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1c5e0 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
1c5f0 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
1c600 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1c610 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1c620 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1c640 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
1c650 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1c660 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
1c670 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1c680 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1c690 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
1c6c0 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
1c6d0 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
1c6e0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1c6f0 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
1c700 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
1c710 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1c720 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
1c730 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1c740 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
1c750 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
1c760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c770 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1c780 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
1c790 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
1c7a0 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
1c7b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1c7c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c7d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1c7e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1c7f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1c800 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
1c810 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
1c820 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1c830 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
1c840 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
1c850 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
1c860 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1c870 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
1c880 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
1c890 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1c8a0 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
1c8b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1c8c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
1c8d0 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
1c8e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
1c8f0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1c900 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
1c910 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1c920 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  int nCell;.    i
1c930 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d  nt rc;..    rc =
1c940 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f   pPage->isInit ?
1c950 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72   SQLITE_OK : btr
1c960 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1c970 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1c980 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
1c990 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1c9a0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
1c9b0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1c9c0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
1c9d0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1c9e0 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
1c9f0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1ca00 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
1ca10 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1ca20 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  fo;.        pPag
1ca30 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
1ca40 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
1ca50 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1ca60 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
1ca70 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
1ca80 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1ca90 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50  +info.nSize > pP
1caa0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
1cab0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
1cac0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1cad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1cae0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
1caf0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
1cb00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cb10 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
1cb20 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1cb30 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20  Size-4) ){.     
1cb40 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1cb50 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1cb60 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  -4, iTo);.      
1cb70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cb80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cb90 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1cba0 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
1cbb0 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
1cbc0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
1cbd0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
1cbe0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1cbf0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1cc00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cc10 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
1cc20 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
1cc30 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
1cc40 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
1cc50 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
1cc60 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1cc70 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
1cc80 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1cc90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1cca0 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
1ccb0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
1ccc0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ccd0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1cce0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1ccf0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ], iTo);.    }. 
1cd00 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1cd10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1cd20 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
1cd30 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1cd40 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
1cd50 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
1cd60 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
1cd70 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
1cd80 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
1cd90 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
1cda0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
1cdb0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
1cdc0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
1cdd0 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
1cde0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
1cdf0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
1ce00 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
1ce10 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
1ce20 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
1ce30 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
1ce40 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1ce50 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
1ce60 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
1ce70 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
1ce80 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
1ce90 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1cea0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1ceb0 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
1cec0 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
1ced0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1cee0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
1cef0 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
1cf00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1cf10 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
1cf20 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1cf30 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
1cf40 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
1cf50 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1cf60 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
1cf70 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1cf80 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
1cf90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cfa0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
1cfb0 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
1cfc0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1cfd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
1cfe0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
1cff0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
1d000 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
1d010 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
1d020 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
1d030 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1d040 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1d050 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1d060 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
1d070 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
1d080 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1d090 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1d0a0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
1d0b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1d0c0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
1d0d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1d0e0 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
1d0f0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1d100 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1d110 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
1d120 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1d130 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1d140 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1d150 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
1d160 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
1d170 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
1d180 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
1d190 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
1d1a0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
1d1b0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
1d1c0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
1d1d0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
1d1e0 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
1d1f0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
1d200 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
1d210 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
1d220 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
1d230 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d240 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
1d250 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
1d260 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
1d270 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
1d280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d290 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d2a0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
1d2b0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
1d2c0 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
1d2d0 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
1d2e0 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
1d2f0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
1d300 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
1d310 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
1d320 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1d330 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
1d340 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1d350 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
1d360 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
1d370 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
1d380 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
1d390 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
1d3a0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
1d3b0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
1d3c0 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
1d3d0 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
1d3e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
1d3f0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1d400 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
1d410 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
1d420 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1d430 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
1d440 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1d450 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1d460 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1d470 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1d480 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1d490 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
1d4a0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
1d4b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1d4c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d4d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d4e0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
1d4f0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
1d500 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
1d510 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
1d520 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
1d530 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1d540 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
1d550 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
1d560 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
1d570 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1d580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d590 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d5b0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
1d5c0 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
1d5d0 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
1d5e0 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
1d5f0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
1d600 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1d610 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
1d620 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
1d630 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
1d640 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
1d650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1d660 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
1d670 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
1d680 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1d690 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
1d6a0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1d6b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d6c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d6d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1d6e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1d6f0 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
1d700 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1d710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d720 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1d730 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1d740 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d750 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1d760 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1d770 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
1d780 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
1d790 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
1d7a0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1d7b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d7c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d7d0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1d7e0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1d7f0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
1d800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1d810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1d820 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1d830 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
1d840 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
1d850 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
1d860 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d870 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
1d880 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
1d890 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
1d8a0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
1d8b0 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
1d8c0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
1d8d0 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
1d8e0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
1d8f0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
1d900 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
1d910 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1d920 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
1d930 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1d940 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
1d950 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1d960 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
1d970 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
1d980 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
1d990 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1d9a0 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
1d9b0 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
1d9c0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
1d9d0 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64  e-organize the d
1d9e0 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74  atabase so .** t
1d9f0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1da00 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
1da10 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69  rrently in use i
1da20 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
1da30 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  se..**.** Parame
1da40 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20  ter nFin is the 
1da50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1da60 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61  that this databa
1da70 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  se would contain
1da80 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75  .** were this fu
1da90 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e  nction called un
1daa0 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1dab0 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
1dac0 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74  * If the bCommit
1dad0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1dae0 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e  n-zero, this fun
1daf0 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
1db00 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  at the .** calle
1db10 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
1db20 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
1db30 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65  ep() until it re
1db40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1db50 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f  E .** or an erro
1db60 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61  r. bCommit is pa
1db70 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e  ssed true for an
1db80 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d   auto-vacuum-on-
1db90 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61  commit .** opera
1dba0 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66  tion, or false f
1dbb0 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  or an incrementa
1dbc0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61  l vacuum..*/.sta
1dbd0 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
1dbe0 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
1dbf0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
1dc00 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69   Pgno iLastPg, i
1dc10 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  nt bCommit){.  P
1dc20 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
1dc30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1dc40 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
1dc50 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
1dc60 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
1dc70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1dc80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1dc90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1dca0 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
1dcb0 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
1dcc0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1dcd0 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
1dce0 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
1dcf0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1dd00 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
1dd10 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
1dd20 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
1dd30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1dd40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1dd50 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
1dd60 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
1dd70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1dd80 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
1dd90 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1dda0 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
1ddb0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
1ddc0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ddd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dde0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ddf0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
1de00 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1de10 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
1de20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1de30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1de40 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1de50 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1de60 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1de70 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1de80 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
1de90 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
1dea0 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
1deb0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1dec0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
1ded0 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d   bCommit is non-
1dee0 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
1def0 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
1df00 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
1df10 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
1df20 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
1df30 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1df40 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
1df50 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
1df60 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
1df70 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
1df80 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
1df90 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1dfa0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1dfb0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1dfc0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1dfd0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1dfe0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1dff0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1e000 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c  g, iLastPg, BTAL
1e010 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
1e020 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e040 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e060 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
1e070 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
1e080 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e090 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1e0a0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
1e0b0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1e0c0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
1e0d0 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
1e0e0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
1e0f0 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
1e100 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
1e110 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64  g;.      u8 eMod
1e120 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b  e = BTALLOC_ANY;
1e130 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d     /* Mode param
1e140 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1e150 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1e160 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72        Pgno iNear
1e170 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e180 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65  /* nearby parame
1e190 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1e1a0 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a  BtreePage() */..
1e1b0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
1e1c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
1e1d0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
1e1e0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1e1f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1e210 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1e220 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
1e230 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
1e240 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
1e250 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
1e260 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
1e270 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
1e280 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1e290 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
1e2a0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
1e2b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
1e2c0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
1e2d0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
1e2e0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
1e2f0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
1e300 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
1e310 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
1e320 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
1e330 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
1e340 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
1e350 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
1e360 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e370 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1e380 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
1e390 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
1e3a0 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
1e3b0 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
1e3c0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
1e3d0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1e3e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1e3f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1e400 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1e410 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
1e420 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
1e430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e450 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1e460 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
1e470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
1e490 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1e4a0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1e4b0 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
1e4c0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
1e4d0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1e4e0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
1e4f0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
1e500 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
1e510 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
1e520 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
1e530 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
1e540 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e550 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1e560 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e570 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1e580 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1e590 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1e5a0 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1e5b0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
1e5c0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
1e5d0 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
1e5e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e5f0 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
1e600 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1e610 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
1e620 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1e630 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
1e640 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
1e650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e660 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1e670 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
1e680 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
1e690 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
1e6a0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1e6b0 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
1e6c0 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
1e6d0 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
1e6e0 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
1e6f0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
1e700 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e710 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
1e720 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
1e730 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
1e740 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
1e750 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
1e760 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
1e770 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
1e780 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e7b0 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
1e7c0 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
1e7d0 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
1e800 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
1e810 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
1e820 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
1e830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e840 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1e850 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
1e860 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
1e870 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
1e880 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
1e890 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
1e8a0 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
1e8b0 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
1e8c0 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
1e8d0 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
1e8e0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e8f0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
1e900 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e910 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1e920 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
1e930 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1e940 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
1e950 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
1e960 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1e970 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
1e980 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
1e990 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
1e9a0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1e9b0 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
1e9c0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1e9d0 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
1e9e0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
1e9f0 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
1ea00 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
1ea10 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
1ea20 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
1ea30 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
1ea40 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
1ea50 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
1ea60 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
1ea70 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
1ea80 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
1ea90 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
1eaa0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
1eab0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1eac0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1ead0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
1eae0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
1eaf0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
1eb00 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
1eb10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1eb20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1eb30 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
1eb40 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1eb50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1eb60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1eb70 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
1eb80 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1eb90 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
1eba0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1ebb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ebc0 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
1ebd0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
1ebe0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1ebf0 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
1ec00 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1ec10 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1ec20 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
1ec30 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
1ec40 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1ec50 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
1ec60 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
1ec70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1ec80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ec90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
1eca0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1ecb0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1ecc0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1ecd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ece0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ecf0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
1ed00 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1ed10 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
1ed20 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1ed30 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
1ed40 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1ed50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ed60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ed70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ed80 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1ed90 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1eda0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1edb0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1edc0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1edd0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1ede0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1edf0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1ee00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1ee10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ee20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ee30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1ee40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1ee50 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
1ee60 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
1ee70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1ee80 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
1ee90 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1eea0 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
1eeb0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1eec0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
1eed0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
1eee0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1eef0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
1ef00 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1ef10 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1ef20 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
1ef30 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
1ef40 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
1ef50 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
1ef60 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
1ef70 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
1ef80 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
1ef90 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
1efa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
1efb0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
1efc0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1efd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1efe0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1eff0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1f000 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
1f010 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
1f020 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1f030 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73  Pager); )..  ass
1f040 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1f050 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1f060 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
1f070 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1f080 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
1f090 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
1f0a0 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
1f0b0 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
1f0c0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
1f0d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f0e0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
1f0f0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
1f100 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
1f110 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
1f120 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f130 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1f140 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
1f150 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
1f160 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
1f170 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
1f180 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
1f190 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
1f1a0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1f1b0 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
1f1c0 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
1f1d0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1f1e0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
1f1f0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1f200 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
1f210 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1f220 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1f230 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
1f240 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
1f250 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
1f260 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
1f270 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
1f280 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
1f290 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
1f2a0 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
1f2b0 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
1f2c0 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
1f2d0 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
1f2e0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
1f2f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f310 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1f320 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
1f330 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1f340 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1f350 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
1f360 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1f370 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
1f380 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
1f390 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1f3a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f3b0 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
1f3c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f3d0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1f3e0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
1f3f0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
1f400 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
1f410 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1f420 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
1f430 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1f440 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1f450 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
1f460 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
1f470 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
1f480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
1f490 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1f4a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f4b0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1f4c0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1f4d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f4e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f4f0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
1f500 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1f510 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1f520 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1f530 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1f540 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
1f550 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
1f560 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1f570 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1f580 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
1f590 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f5a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f5b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1f5c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1f5d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1f5e0 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
1f5f0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1f600 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
1f610 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
1f620 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
1f630 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
1f640 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
1f650 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
1f660 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
1f670 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f680 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1f690 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
1f6a0 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
1f6b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1f6c0 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
1f6d0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
1f6e0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
1f6f0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
1f700 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
1f710 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
1f720 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
1f730 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
1f740 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
1f750 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1f760 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1f770 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1f780 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
1f790 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
1f7a0 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
1f7b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1f7c0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
1f7d0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
1f7e0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
1f7f0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
1f800 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
1f810 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
1f820 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
1f830 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1f840 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f850 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
1f860 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
1f870 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
1f880 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
1f890 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
1f8a0 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
1f8b0 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
1f8c0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
1f8d0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
1f8e0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
1f8f0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
1f900 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
1f910 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1f920 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
1f930 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
1f940 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
1f950 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
1f960 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
1f970 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
1f980 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
1f990 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
1f9a0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1f9b0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
1f9c0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1f9d0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
1f9e0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
1f9f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1fa00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1fa10 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1fa20 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1fa30 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
1fa40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
1fa50 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
1fa60 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
1fa70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
1fa80 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
1fa90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1faa0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1fab0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
1fac0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
1fad0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
1fae0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
1faf0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
1fb00 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
1fb10 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
1fb20 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1fb30 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
1fb40 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
1fb50 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
1fb60 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
1fb70 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
1fb80 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
1fb90 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1fba0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
1fbb0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
1fbc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1fbd0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1fbe0 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
1fbf0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
1fc00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1fc10 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
1fc20 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1fc30 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1fc40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1fc50 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1fc60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
1fc70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fc80 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1fc90 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1fca0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
1fcb0 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
1fcc0 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
1fcd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1fcf0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1fd00 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
1fd10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1fd20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1fd30 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
1fd40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1fd50 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1fd60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
1fd70 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
1fd80 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
1fd90 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1fda0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
1fdb0 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
1fdc0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1fdd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1fde0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1fdf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1fe00 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1fe10 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
1fe20 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1fe30 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
1fe40 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
1fe50 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
1fe60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1fe70 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
1fe80 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1fe90 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1fea0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1feb0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
1fec0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
1fed0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1fee0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1fef0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1ff00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1ff10 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
1ff20 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
1ff30 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
1ff40 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
1ff50 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
1ff60 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1ff70 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
1ff80 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
1ff90 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
1ffa0 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
1ffb0 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
1ffc0 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
1ffd0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1ffe0 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
1fff0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
20000 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
20010 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
20020 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
20030 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
20040 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
20050 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
20060 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
20070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
20080 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
20090 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
200a0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
200b0 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
200c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
200d0 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
200e0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
200f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20100 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
20110 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
20120 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
20130 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
20140 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
20150 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
20160 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
20170 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
20180 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
20190 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
201a0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
201b0 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
201c0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
201d0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
201e0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
201f0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
20200 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
20210 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
20220 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
20230 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
20240 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
20250 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
20260 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
20270 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
20280 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
20290 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
202a0 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
202b0 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
202c0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
202d0 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
202e0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
202f0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
20300 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
20310 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
20320 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
20330 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
20340 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
20350 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
20360 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20370 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
20380 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
20390 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
203a0 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
203b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
203c0 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
203d0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
203e0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
203f0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
20400 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
20410 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
20420 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
20430 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
20440 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
20450 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
20460 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
20470 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
20480 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
20490 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
204a0 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
204b0 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
204c0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
204d0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
204e0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
204f0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
20500 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
20510 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
20520 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
20530 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
20540 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20550 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
20560 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
20570 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
20580 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20590 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
205a0 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
205b0 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
205c0 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
205d0 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
205e0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
205f0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
20600 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
20610 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
20620 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
20630 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
20640 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
20650 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
20660 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
20670 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
20680 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
20690 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
206a0 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
206b0 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
206c0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
206d0 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
206e0 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
206f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
20700 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
20710 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
20720 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
20730 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
20740 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
20750 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
20760 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
20770 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
20780 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
20790 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
207a0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
207b0 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
207c0 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
207d0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
207e0 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
207f0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
20800 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
20810 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
20820 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
20830 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
20840 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
20850 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20860 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
20870 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
20880 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
20890 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
208a0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
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 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
208d0 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
208e0 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
208f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
20900 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
20910 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
20920 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
20930 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
20940 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
20950 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
20960 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
20970 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
20980 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
20990 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
209a0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
209b0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
209c0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
209d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
209e0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
209f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
20a00 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
20a10 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
20a20 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
20a30 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
20a40 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
20a50 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
20a60 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
20a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
20a80 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
20a90 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
20aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20ab0 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
20ac0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
20ad0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20ae0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20af0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74     }.    p->iDat
20b00 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20  aVersion--;  /* 
20b10 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70  Compensate for p
20b20 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
20b30 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42  ion++; */.    pB
20b40 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
20b50 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
20b60 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
20b70 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
20b80 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
20b90 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
20ba0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
20bb0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
20bc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20bd0 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
20be0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
20bf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20c00 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
20c10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
20c20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20c30 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
20c40 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
20c50 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
20c60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20c70 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
20c80 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
20c90 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
20ca0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
20cb0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
20cc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20cd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
20ce0 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
20cf0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
20d00 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
20d10 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
20d20 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
20d30 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20  on any BtShared 
20d40 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
20d50 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69  eferences.  Or i
20d60 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
20d70 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31  flag is set to 1
20d80 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74  , then only.** t
20d90 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72  rip write cursor
20da0 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64  s and leave read
20db0 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67   cursors unchang
20dc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  ed..**.** Every 
20dd0 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64  cursor is a cand
20de0 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70  idate to be trip
20df0 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
20e00 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62  ursors.** that b
20e10 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64  elong to other d
20e20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20e30 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
20e40 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67  to be.** sharing
20e50 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
20e60 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
20e70 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
20e80 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
20e90 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49  llback occurs. I
20ea0 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a  f the writeOnly.
20eb0 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ** flag is true,
20ec0 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
20ed0 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65  -cursors need be
20ee0 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d   tripped - read-
20ef0 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20  only.** cursors 
20f00 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65  save their curre
20f10 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20  nt positions so 
20f20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f  that they may co
20f30 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  ntinue .** follo
20f40 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  wing the rollbac
20f50 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f  k. Or, if writeO
20f60 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c  nly is false, al
20f70 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a  l cursors are .*
20f80 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65  * tripped. In ge
20f90 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79  neral, writeOnly
20fa0 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
20fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
20fc0 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ng.** rolled bac
20fd0 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  k modified the d
20fe0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
20ff0 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74  In this case b-t
21000 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ree root.** page
21010 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f  s may be moved o
21020 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  r deleted from t
21030 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f  he database alto
21040 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a  gether, making.*
21050 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20  * it unsafe for 
21060 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20  read cursors to 
21070 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
21080 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
21090 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e   flag is true an
210a0 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  d an error is en
210b0 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
210c0 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63  .** saving the c
210d0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
210e0 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  of a read-only c
210f0 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f  ursor, all curso
21100 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  rs, .** includin
21110 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f  g all read-curso
21120 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a  rs are tripped..
21130 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
21140 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
21150 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
21160 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21170 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67   while.** saving
21180 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
21190 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  on, an SQLite er
211a0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
211b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
211c0 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
211d0 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
211e0 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  rrCode, int writ
211f0 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  eOnly){.  BtCurs
21200 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20  or *p;.  int rc 
21210 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
21220 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e  assert( (writeOn
21230 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==0 || writeOn
21240 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57  ly==1) && BTCF_W
21250 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  riteFlag==1 );. 
21260 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
21270 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
21280 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
21290 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
212a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
212b0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
212c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
212d0 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26   if( writeOnly &
212e0 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26  & (p->curFlags &
212f0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
21300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
21310 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
21320 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
21330 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21340 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
21350 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43        rc = saveC
21360 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
21370 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21390 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
213a0 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54  id)sqlite3BtreeT
213b0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  ripAllCursors(pB
213c0 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20  tree, rc, 0);.  
213d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
213e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
213f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
21400 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
21410 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
21420 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20  sor(p);.        
21430 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
21440 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20  OR_FAULT;.      
21450 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
21460 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d  errCode;.      }
21470 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21480 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
21490 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
214a0 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
214b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  [i]);.        p-
214c0 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
214d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
214e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
214f0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
21500 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21510 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
21520 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21530 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
21540 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  ** If tripCode i
21550 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
21560 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c  then cursors wil
21570 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  l be invalidated
21580 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f   (tripped)..** O
21590 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
215a0 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66  s are tripped if
215b0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72   writeOnly is tr
215c0 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f  ue but all curso
215d0 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65  rs are.** trippe
215e0 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
215f0 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74  s false.  Any at
21600 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20  tempt to use.** 
21610 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72  a tripped cursor
21620 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
21630 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
21640 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
21650 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
21660 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21670 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
21680 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
21690 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
216a0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
216b0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
216c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
216d0 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
216e0 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69   int tripCode, i
216f0 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
21700 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
21710 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21720 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
21730 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  age1;..  assert(
21740 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c   writeOnly==1 ||
21750 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b   writeOnly==0 );
21760 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43  .  assert( tripC
21770 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52  ode==SQLITE_ABOR
21780 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72  T_ROLLBACK || tr
21790 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
217a0 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  K );.  sqlite3Bt
217b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
217c0 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
217d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
217e0 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
217f0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
21800 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
21810 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20   rc ) writeOnly 
21820 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
21830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21840 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70  ;.  }.  if( trip
21850 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Code ){.    int 
21860 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
21870 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
21880 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72  (p, tripCode, wr
21890 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73  iteOnly);.    as
218a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
218b0 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c  _OK || (writeOnl
218c0 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c  y==0 && rc2==SQL
218d0 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69  ITE_OK) );.    i
218e0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
218f0 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
21900 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
21910 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
21920 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
21930 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
21940 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
21950 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
21960 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21970 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
21980 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
21990 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
219a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
219b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
219c0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
219d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
219e0 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
219f0 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
21a00 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
21a10 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
21a20 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
21a30 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
21a40 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
21a50 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
21a60 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
21a70 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
21a80 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
21a90 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
21aa0 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
21ab0 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
21ac0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
21ad0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
21ae0 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
21af0 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
21b00 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
21b10 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
21b20 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
21b30 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
21b40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21b50 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
21b60 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
21b70 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
21b80 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21b90 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
21ba0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
21bb0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
21bc0 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
21bd0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
21be0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
21bf0 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
21c00 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
21c10 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
21c20 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
21c30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
21c40 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
21c50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
21c60 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
21c70 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
21c80 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
21c90 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
21ca0 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
21cb0 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
21cc0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
21cd0 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
21ce0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
21cf0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
21d00 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
21d10 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
21d20 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
21d30 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
21d40 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
21d50 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
21d60 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
21d70 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
21d80 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
21d90 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
21da0 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
21db0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
21dc0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
21dd0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
21de0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
21df0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
21e00 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
21e10 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
21e20 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
21e30 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
21e40 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
21e50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
21e60 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
21e70 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
21e80 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
21e90 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
21ea0 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
21eb0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
21ec0 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
21ed0 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
21ee0 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
21ef0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
21f00 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
21f10 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
21f20 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
21f30 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
21f40 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
21f50 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
21f60 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
21f70 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
21f80 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
21f90 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
21fa0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
21fb0 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
21fc0 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
21fd0 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
21fe0 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
21ff0 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
22000 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
22010 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
22020 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
22030 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
22040 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
22050 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
22060 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
22070 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
22080 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22090 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
220a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
220b0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
220c0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
220d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
220e0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
220f0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
22100 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
22110 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
22120 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
22130 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
22140 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
22150 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22160 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
22170 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
22180 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
22190 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
221a0 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
221b0 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
221c0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
221d0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
221e0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
221f0 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
22200 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
22210 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
22220 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
22230 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
22240 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
22250 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
22260 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22270 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
22280 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
22290 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
222a0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
222b0 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
222c0 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  ement);.  sqlite
222d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
222e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
222f0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
22300 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
22310 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
22320 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
22330 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
22340 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
22350 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
22360 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
22370 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
22380 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
22390 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
223a0 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
223b0 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
223c0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
223d0 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
223e0 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
223f0 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
22400 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
22410 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
22420 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
22430 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
22440 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
22450 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
22460 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
22470 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
22480 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
22490 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
224a0 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
224b0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
224c0 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
224d0 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
224e0 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
224f0 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
22500 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
22510 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
22520 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22530 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
22540 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
22550 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
22560 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22570 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
22580 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
22590 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
225a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
225b0 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
225c0 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
225d0 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
225e0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
225f0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
22600 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
22610 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
22620 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
22630 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
22640 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22650 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69  eEnter(p);.    i
22660 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
22670 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
22680 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
22690 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
226a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
226b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
226c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
226d0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
226e0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
226f0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
22700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22720 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
22730 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
22740 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
22750 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
22760 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
22770 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
22780 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
22790 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
227a0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
227b0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
227c0 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
227d0 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
227e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
227f0 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
22800 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
22810 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
22820 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
22830 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22840 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
22850 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
22860 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
22870 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
22880 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
22890 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
228a0 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
228b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
228c0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
228d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
228e0 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
228f0 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
22900 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
22910 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
22920 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
22930 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
22940 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
22950 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
22960 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
22970 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
22980 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
22990 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
229a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
229b0 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
229c0 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
229d0 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
229e0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
229f0 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
22a00 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
22a10 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
22a20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
22a30 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61  CSR bit of wrFla
22a40 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e  g is clear, then
22a50 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
22a60 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  only.** be used 
22a70 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66  for reading.  If
22a80 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
22a90 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
22aa0 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  n the cursor.** 
22ab0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
22ac0 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77  reading or for w
22ad0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
22ae0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
22af0 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c  riting.** are al
22b00 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61  so met.  These a
22b10 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
22b20 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
22b30 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66  et in order.** f
22b40 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65  or writing to be
22b50 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
22b60 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
22b70 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
22b80 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
22b90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45   containing BTRE
22ba0 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a  E_WRCSR.**.** 2:
22bb0 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
22bc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
22bd0 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
22be0 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
22bf0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
22c00 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
22c10 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
22c20 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
22c30 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
22c40 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
22c50 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
22c60 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
22c70 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
22c80 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
22c90 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
22ca0 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
22cb0 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
22cc0 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
22cd0 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
22ce0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
22cf0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
22d00 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
22d10 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
22d20 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
22d30 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
22d40 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
22d50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
22d60 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52  ** The BTREE_FOR
22d70 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72  DELETE bit of wr
22d80 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61  Flag may optiona
22d90 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54  lly be set if BT
22da0 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20  REE_WRCSR.** is 
22db0 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45  set.  If FORDELE
22dc0 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  TE is set, that 
22dd0 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
22de0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
22df0 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72  that.** this cur
22e00 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  sor will only be
22e10 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f   used to seek to
22e20 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72   and delete entr
22e30 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ies of an index.
22e40 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ** as part of a 
22e50 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74  larger DELETE st
22e60 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f  atement.  The FO
22e70 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20  RDELETE hint is 
22e80 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  not used by.** t
22e90 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
22ea0 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79  on.  But in a hy
22eb0 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72  pothetical alter
22ec0 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65  native storage e
22ed0 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69  ngine .** in whi
22ee0 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ch index entries
22ef0 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
22f00 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
22f10 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
22f20 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20  ble.** rows are 
22f30 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52  deleted, the FOR
22f40 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61  DELETE flag is a
22f50 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53   hint that all S
22f60 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a  EEK and DELETE.*
22f70 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  * operations on 
22f80 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20  this cursor can 
22f90 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c  be no-ops and al
22fa0 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e  l READ operation
22fb0 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e  s can .** return
22fc0 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62   a null row (2-b
22fd0 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29  ytes: 0x01 0x00)
22fe0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
22ff0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
23000 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
23010 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
23020 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
23030 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
23040 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
23050 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
23060 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
23070 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
23080 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
23090 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
230a0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
230b0 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
230c0 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
230d0 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
230e0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
230f0 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
23100 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
23110 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
23120 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
23130 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23160 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
23170 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23190 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
231a0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
231b0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
231c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
231e0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
231f0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
23200 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
23210 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
23220 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
23230 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
23240 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
23250 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
23280 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
23290 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
232a0 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
232b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
232c0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
232d0 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  le */.  BtCursor
232e0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23300 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f  * Looping over o
23310 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73  ther all cursors
23320 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
23330 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
23340 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
23350 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
23360 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
23370 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a  g==BTREE_WRCSR .
23380 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
23390 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42  ==(BTREE_WRCSR|B
233a0 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20  TREE_FORDELETE) 
233b0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
233c0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
233d0 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
233e0 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
233f0 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
23400 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
23410 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
23420 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
23430 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
23440 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
23450 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
23460 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
23470 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
23480 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
23490 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
234a0 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
234b0 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
234c0 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
234d0 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
234e0 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29  0, (wrFlag?2:1))
234f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
23500 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
23510 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
23520 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
23530 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
23540 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
23550 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
23560 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
23570 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
23580 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
23590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
235a0 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
235b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
235c0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
235d0 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
235e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
235f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
23600 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d  Flag==0 || (pBt-
23610 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
23620 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
23630 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ..  if( wrFlag )
23640 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  {.    allocateTe
23650 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
23660 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
23670 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
23680 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
23690 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  PT;.  }.  if( iT
236a0 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
236b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
236c0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
236d0 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
236e0 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
236f0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
23700 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
23710 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
23720 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
23730 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
23740 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
23750 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
23760 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
23770 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
23780 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
23790 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
237a0 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
237b0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
237c0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
237d0 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
237e0 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
237f0 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  t;.  pCur->curFl
23800 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42  ags = wrFlag ? B
23810 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20  TCF_WriteFlag : 
23820 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61  0;.  pCur->curPa
23830 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  gerFlags = wrFla
23840 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45  g ? 0 : PAGER_GE
23850 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a  T_READONLY;.  /*
23860 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
23870 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
23880 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
23890 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
238a0 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  ch.  ** cursors 
238b0 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20  *must* have the 
238c0 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
238d0 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72  ag set. */.  for
238e0 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  (pX=pBt->pCursor
238f0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
23900 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  xt){.    if( pX-
23910 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f  >pgnoRoot==(Pgno
23920 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  )iTable ){.     
23930 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d   pX->curFlags |=
23940 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
23950 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
23960 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
23970 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  tiple;.    }.  }
23980 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
23990 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
239a0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
239b0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
239c0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
239d0 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  VALID;.  return 
239e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
239f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23a00 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
23a40 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
23a80 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
23a90 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
23ad0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
23ae0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
23af0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
23b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23b10 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
23b20 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
23b30 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
23b60 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
23b70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
23b80 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20  .  if( iTable<1 
23b90 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
23ba0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23bb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
23bc0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23bd0 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  p);.    rc = btr
23be0 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
23bf0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
23c00 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20  Info, pCur);.   
23c10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
23c20 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
23c30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23c40 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
23c50 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
23c60 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
23c70 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
23c80 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
23c90 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
23ca0 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
23cb0 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
23cc0 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
23cd0 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
23ce0 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
23cf0 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
23d00 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
23d10 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
23d20 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
23d30 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
23d40 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
23d50 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
23d60 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23d70 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
23d80 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
23d90 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
23da0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
23db0 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
23dc0 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
23dd0 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
23de0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
23df0 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
23e00 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
23e10 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
23e20 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
23e30 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
23e40 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
23e50 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
23e60 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
23e70 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
23e80 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
23e90 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
23ea0 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
23eb0 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
23ec0 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
23ed0 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
23ee0 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
23ef0 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
23f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23f10 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
23f20 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
23f30 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
23f40 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
23f50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
23f60 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
23f70 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
23f80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23f90 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
23fa0 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
23fb0 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
23fc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23fd0 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
23fe0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
23ff0 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
24000 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
24010 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
24020 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
24030 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
24040 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
24050 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
24060 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
24070 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
24080 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73  r(pCur);.    ass
24090 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
240a0 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
240b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43  pBt->pCursor==pC
240c0 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ur ){.      pBt-
240d0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
240e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
240f0 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f  e{.      BtCurso
24100 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e  r *pPrev = pBt->
24110 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64  pCursor;.      d
24120 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
24130 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75  Prev->pNext==pCu
24140 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
24150 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
24160 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ur->pNext;.     
24170 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24180 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
24190 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65  rev = pPrev->pNe
241a0 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  xt;.      }while
241b0 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20  ( ALWAYS(pPrev) 
241c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
241d0 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
241e0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
241f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
24200 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
24210 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
24220 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
24230 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
24240 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
24250 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
24260 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
24270 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
24280 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
24290 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
242a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
242b0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
242c0 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
242d0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
242e0 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
242f0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
24300 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
24310 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
24320 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
24330 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
24340 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
24350 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
24360 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
24370 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
24380 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
24390 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
243a0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
243b0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
243c0 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
243d0 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23  arseCell()..*/.#
243e0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
243f0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
24400 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
24410 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
24420 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
24430 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
24440 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
24450 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
24460 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
24470 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
24480 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
24490 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 69 78  iPage], pCur->ix
244a0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
244b0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
244c0 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f   || memcmp(&info
244d0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
244e0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
244f0 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
24500 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
24510 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
24520 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
24530 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43  INLINE void getC
24540 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
24550 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
24560 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
24570 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50  =0 ){.    int iP
24580 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
24590 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  e;.    pCur->cur
245a0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
245b0 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72  lidNKey;.    btr
245c0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
245d0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
245e0 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e  pCur->ix,&pCur->
245f0 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  info);.  }else{.
24600 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
24610 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  fo(pCur);.  }.}.
24620 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
24630 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
24640 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
24650 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
24660 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
24670 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
24680 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
24690 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
246a0 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
246b0 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
246c0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
246d0 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
246e0 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
246f0 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
24700 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
24710 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
24720 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
24730 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
24740 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24750 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
24760 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24770 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
24780 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
24790 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
247a0 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
247b0 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  G */.int sqlite3
247c0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
247d0 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70  idNN(BtCursor *p
247e0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
247f0 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  pCur!=0 );.  ret
24800 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
24810 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
24820 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24830 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
24840 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20   integer key or 
24850 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61  "rowid" for a ta
24860 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68  ble btree..** Th
24870 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
24880 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63  ly valid for a c
24890 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
248a0 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a  inting into a.**
248b0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
248c0 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 63  btree.  If the c
248d0 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
248e0 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f  an index btree o
248f0 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c  r.** is invalid,
24900 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
24910 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
24920 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34  ndefined..*/.i64
24930 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
24940 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72  egerKey(BtCursor
24950 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
24960 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24970 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
24980 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
24990 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
249a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
249b0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
249c0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
249d0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
249e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
249f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24a00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
24a10 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
24a20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
24a30 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75  at pCur is.** cu
24a40 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
24a50 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20   to.  For table 
24a60 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c  btrees, this wil
24a70 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a  l be the amount.
24a80 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72  ** of data.  For
24a90 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74   index btrees, t
24aa0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
24ab0 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e  size of the key.
24ac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
24ad0 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
24ae0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
24af0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
24b00 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
24b10 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
24b20 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
24b30 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
24b40 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
24b50 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
24b60 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
24b70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24b80 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  LID..*/.u32 sqli
24b90 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
24ba0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
24bb0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
24bc0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24bd0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24be0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24bf0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
24c00 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
24c10 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
24c20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
24c30 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ad;.}../*.** Giv
24c40 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
24c50 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
24c60 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
24c70 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
24c80 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
24c90 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
24ca0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
24cb0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
24cc0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
24cd0 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
24ce0 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
24cf0 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
24d00 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
24d10 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
24d20 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
24d30 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
24d40 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
24d50 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
24d60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
24d70 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
24d80 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
24d90 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
24da0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
24db0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
24dc0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
24dd0 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
24de0 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
24df0 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
24e00 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
24e10 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
24e20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
24e30 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
24e40 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
24e50 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
24e60 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
24e70 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
24e80 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
24e90 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
24ea0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
24eb0 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
24ec0 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
24ed0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
24ee0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
24ef0 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
24f00 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
24f10 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
24f20 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
24f30 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
24f40 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
24f50 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
24f60 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
24f70 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
24f80 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
24f90 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
24fa0 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
24fb0 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
24fc0 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
24fd0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
24fe0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
24ff0 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
25000 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
25010 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
25020 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
25030 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
25040 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
25050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25060 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
25070 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
25080 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
25090 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
250a0 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
250b0 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
250c0 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
250d0 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
250e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
250f0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
25100 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
25110 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
25120 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
25130 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
25140 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
25150 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25160 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
25170 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
25180 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
25190 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
251a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
251b0 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
251c0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
251d0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
251e0 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
251f0 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
25200 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
25210 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
25220 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
25230 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
25240 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
25250 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
25260 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
25270 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
25280 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
25290 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
252a0 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
252b0 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
252c0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
252d0 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
252e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
252f0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
25300 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
25310 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
25320 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
25330 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
25340 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
25350 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
25360 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
25370 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
25380 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
25390 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
253a0 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
253b0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
253c0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
253d0 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
253e0 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
253f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
25400 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
25410 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
25420 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
25430 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
25440 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
25450 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25460 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
25470 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
25480 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
25490 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
254a0 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
254b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
254c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
254d0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
254e0 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
254f0 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
25500 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
25510 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
25520 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
25530 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
25540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25550 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
25560 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
25570 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
25580 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
25590 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
255a0 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
255b0 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
255c0 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
255d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
255e0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
255f0 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
25600 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
25610 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
25620 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
25630 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
25640 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
25650 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
25660 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
25670 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
25680 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
25690 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
256a0 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
256b0 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
256c0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
256d0 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
256e0 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
256f0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
25700 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
25710 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
25720 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
25730 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
25740 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
25750 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
25760 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
25770 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
25780 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
25790 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
257a0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
257b0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
257c0 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
257d0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
257e0 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
257f0 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
25800 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
25810 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
25820 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
25830 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
25840 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
25850 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
25860 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
25870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25880 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
25890 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
258a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
258b0 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
258c0 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
258d0 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
258e0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
258f0 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
25900 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
25910 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
25920 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
25930 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
25940 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
25950 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
25960 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
25970 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25980 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
25990 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
259a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
259b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
259c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
259d0 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
259e0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
259f0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
25a00 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
25a10 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
25a20 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
25a30 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
25a40 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
25a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25a60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
25a70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
25a80 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
25a90 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
25aa0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
25ab0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
25ac0 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
25ad0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
25ae0 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
25af0 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
25b00 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
25b10 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
25b20 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
25b30 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
25b40 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
25b50 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
25b60 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
25b70 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
25b80 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
25b90 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
25ba0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
25bb0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
25bc0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
25bd0 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
25be0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
25bf0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
25c00 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
25c10 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
25c20 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
25c30 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
25c40 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
25c50 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
25c60 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
25c70 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
25c80 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
25c90 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
25ca0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
25cb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a  overflow pages.*
25cc0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
25cd0 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
25ce0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
25cf0 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68  y populate.** th
25d00 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
25d10 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
25d20 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
25d30 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
25d40 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
25d50 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
25d60 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
25d70 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
25d80 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
25d90 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
25da0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25db0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
25dc0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
25dd0 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69   it must be.** i
25de0 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
25df0 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
25e00 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
25e10 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
25e20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
25e30 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
25e40 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
25e50 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
25e60 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
25e70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
25e80 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
25e90 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
25ea0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
25eb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
25ec0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
25ed0 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
25ee0 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
25ef0 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
25f00 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
25f10 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
25f20 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
25f30 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
25f40 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
25f50 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
25f60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
25f70 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
25f80 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
25f90 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
25fa0 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
25fb0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
25fc0 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
25fd0 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
25fe0 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
25ff0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
26000 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
26010 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
26020 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
26030 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
26040 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
26050 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
26060 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
26070 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
26080 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
26090 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
260a0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
260b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
260c0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
260d0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
260e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
260f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
26100 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
26110 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
26120 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
26130 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26150 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
26160 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
26170 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26180 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26190 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
261a0 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
261b0 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20  ufStart = pBuf; 
261c0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
261d0 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66  original out buf
261e0 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  fer */.#endif.. 
261f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
26200 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ;.  assert( eOp=
26210 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a  =0 || eOp==1 );.
26220 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26230 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
26240 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
26250 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
26260 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
26270 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26280 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
26290 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
262a0 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
262b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
262c0 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28  yload;.  assert(
262d0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
262e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
262f0 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad );..  assert(
26300 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67   aPayload > pPag
26310 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66  e->aData );.  if
26320 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61  ( (uptr)(aPayloa
26330 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d - pPage->aData
26340 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  ) > (pBt->usable
26350 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66  Size - pCur->inf
26360 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  o.nLocal) ){.   
26370 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
26380 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
26390 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
263a0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
263b0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f  .  The.    ** co
263c0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20  nditional above 
263d0 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a  is really:.    *
263e0 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70  *    &aPayload[p
263f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
26400 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
26410 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
26420 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73  e].    ** but is
26430 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73   recast into its
26440 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f   current form to
26450 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f   avoid integer o
26460 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73  verflow problems
26470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
26480 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
26490 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
264a0 6e 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  no);.  }..  /* C
264b0 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
264c0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
264d0 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
264e0 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
264f0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
26500 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
26510 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
26520 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
26530 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
26540 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
26550 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
26560 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
26570 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
26580 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
26590 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
265a0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
265b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
265c0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
265d0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
265e0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
265f0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
26600 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
26610 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
26620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26630 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
26640 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
26650 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
26660 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
26670 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
26680 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
26690 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
266a0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
266b0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
266c0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
266d0 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
266e0 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
266f0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
26700 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
26710 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
26720 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   now..    **.   
26730 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
26740 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
26750 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
26760 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
26770 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
26780 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
26790 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
267a0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
267b0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
267c0 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
267d0 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
267e0 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
267f0 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
26800 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
26810 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
26820 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
26830 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
26840 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
26850 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
26860 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
26870 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
26880 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
26890 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
268a0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
268b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
268c0 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
268d0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
268e0 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
268f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
26900 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
26910 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  )sqlite3Realloc(
26920 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
26930 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f  r->aOverflow, nO
26940 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e  vfl*2*sizeof(Pgn
26950 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
26960 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
26970 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
26980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
26990 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
269a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
269b0 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
269c0 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
269d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
269e0 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
269f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26a00 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
26a10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
26a20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
26a30 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43  Pgno));.      pC
26a40 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
26a50 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
26a60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26a70 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
26a80 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
26a90 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
26aa0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
26ab0 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f       ** entry fo
26ac0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
26ad0 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
26ae0 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
26af0 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63  p.      ** direc
26b00 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20  tly to it..     
26b10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
26b20 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
26b30 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
26b40 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78 20 3d  {.        iIdx =
26b50 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
26b60 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  e);.        next
26b70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
26b80 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
26b90 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
26ba0 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
26bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
26bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
26be0 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  t>0 );.    while
26bf0 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20  ( nextPage ){.  
26c00 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
26c10 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
26c20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
26c30 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
26c40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26c50 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
26c60 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  ]==0.           
26c70 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65     || pCur->aOve
26c80 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
26c90 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 20  tPage.          
26ca0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
26cb0 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  B );.      pCur-
26cc0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
26cd0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20   = nextPage;..  
26ce0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
26cf0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
26d00 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
26d10 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
26d20 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
26d30 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
26d40 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
26d50 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
26d60 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
26d70 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
26d80 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
26d90 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
26da0 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
26db0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
26dc0 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
26dd0 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
26de0 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
26df0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
26e00 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
26e10 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
26e20 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
26e30 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
26e40 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  rt( pCur->curFla
26e50 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
26e60 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  vfl );.        a
26e70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74  ssert( pCur->pBt
26e80 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62  ree->db==pBt->db
26e90 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
26ea0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26eb0 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
26ec0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
26ed0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26ee0 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
26ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26f00 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
26f10 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
26f20 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
26f30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
26f40 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
26f50 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
26f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26f70 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
26f80 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
26f90 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
26fa0 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
26fb0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
26fc0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
26fd0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
26fe0 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
26ff0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
27000 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
27010 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
27020 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
27030 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
27040 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20     /* File from 
27050 77 68 69 63 68 20 74 6f 20 64 6f 20 64 69 72 65  which to do dire
27060 63 74 20 6f 76 65 72 66 6c 6f 77 20 72 65 61 64  ct overflow read
27070 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
27080 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
27090 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
270a0 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
270b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
270c0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
270d0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
270e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
270f0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
27100 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
27110 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
27120 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
27130 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
27140 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
27150 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
27160 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
27170 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
27180 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
27190 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
271a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
271b0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
271c0 33 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  3) there is no o
271d0 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
271e0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
271f0 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64     **   4) the d
27200 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
27210 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
27220 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
27230 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
27240 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20  he WAL file.    
27250 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c      **   6) at l
27260 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76  east 4 bytes hav
27270 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
27280 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ead into the out
27290 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20  put buffer .    
272a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
272b0 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
272c0 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
272d0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
272e0 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
272f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
27300 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
27310 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
27320 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
27330 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
27340 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
27350 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
27360 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
27370 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
27380 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27390 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20    if( eOp==0    
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273c0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
273d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
273e0 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
27420 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
27430 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
27440 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
27450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33             /* (3
27460 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
27470 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
27480 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
27490 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
274a0 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
274b0 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
274c0 69 74 65 33 50 61 67 65 72 55 73 65 57 61 6c 28  ite3PagerUseWal(
274d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
274e0 74 50 61 67 65 29 20 20 20 20 20 20 20 2f 2a 20  tPage)       /* 
274f0 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (5) */.         
27500 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42  && &pBuf[-4]>=pB
27510 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20  ufStart         
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27530 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
27540 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
27550 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
27560 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
27570 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
27580 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  4];.          as
27590 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42  sert( aWrite>=pB
275a0 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20  ufStart );      
275b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275c0 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29     /* due to (6)
275d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
275e0 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
275f0 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
27600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27610 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
27620 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
27630 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
27640 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
27650 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
27660 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
27670 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
27680 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
27690 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
276a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
276b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
276c0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
276d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
276e0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
276f0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
27700 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20  ge, &pDbPage,.  
27710 20 20 20 20 20 20 20 20 20 20 20 20 28 65 4f 70              (eOp
27720 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
27730 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
27740 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27750 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27770 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
27780 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
27790 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
277a0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
277b0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
277c0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
277d0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
277e0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
277f0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
27800 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
27810 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27820 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
27830 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
27840 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
27850 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
27860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27870 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
27880 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29      if( amt==0 )
27890 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
278a0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
278b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
278c0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
278d0 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d     iIdx++;.    }
278e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
278f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
27900 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  >0 ){.    /* Ove
27910 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73  rflow chain ends
27920 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a   prematurely */.
27930 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27940 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
27950 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
27960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27970 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
27980 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   of the payload 
27990 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77  for the row at w
279a0 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f 72  hich that cursor
279b0 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e 74   pCur is current
279c0 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  ly.** pointing. 
279d0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
279e0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64  l be transferred
279f0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
27a00 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
27a10 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
27a20 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61  "..**.** pCur ca
27a30 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  n be pointing to
27a40 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65 20   either a table 
27a50 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  or an index b-tr
27a60 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69  ee..** If pointi
27a70 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74  ng to a table bt
27a80 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ree, then the co
27a90 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73  ntent section is
27aa0 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43   read.  If.** pC
27ab0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
27ac0 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  o an index b-tre
27ad0 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73  e then the key s
27ae0 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a  ection is read..
27af0 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65  **.** For sqlite
27b00 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c  3BtreePayload(),
27b10 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
27b20 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
27b30 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a  r is pointing.**
27b40 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20   to a valid row 
27b50 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46  in the table.  F
27b60 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
27b70 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c  ayloadChecked(),
27b80 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d   the.** cursor m
27b90 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20  ight be invalid 
27ba0 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  or might need to
27bb0 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65 66   be restored bef
27bc0 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a  ore being read..
27bd0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
27be0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
27bf0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
27c00 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
27c10 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
27c20 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
27c30 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
27c40 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
27c50 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
27c60 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
27c70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27c80 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72  Payload(BtCursor
27c90 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
27ca0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
27cb0 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
27cc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27cd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
27ce0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27cf0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27d00 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
27d10 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
27d20 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
27d30 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
27d40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27d50 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  x<pCur->apPage[p
27d60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
27d70 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
27d80 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
27d90 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
27da0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
27db0 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
27dc0 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74 20  ** This variant 
27dd0 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  of sqlite3BtreeP
27de0 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20 65  ayload() works e
27df0 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73 6f  ven if the curso
27e00 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20  r has not.** in 
27e10 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  the CURSOR_VALID
27e20 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20 6f   state.  It is o
27e30 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
27e40 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
27e50 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  d().** interface
27e60 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
27e70 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
27e80 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  B.static SQLITE_
27e90 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63  NOINLINE int acc
27ea0 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  essPayloadChecke
27eb0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
27ec0 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73 65  Cur,.  u32 offse
27ed0 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20 20  t,.  u32 amt,.  
27ee0 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20  void *pBuf.){.  
27ef0 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20 70  int rc;.  if ( p
27f00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27f10 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
27f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27f30 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73  _ABORT;.  }.  as
27f40 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
27f50 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
27f60 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52 65  ;.  rc = btreeRe
27f70 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
27f80 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ion(pCur);.  ret
27f90 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61 63  urn rc ? rc : ac
27fa0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
27fb0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
27fc0 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  Buf, 0);.}.int s
27fd0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
27fe0 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72 73  adChecked(BtCurs
27ff0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
28000 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
28010 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 66  oid *pBuf){.  if
28020 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28030 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
28040 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72 73      assert( curs
28050 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
28060 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75  Cur) );.    retu
28070 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
28080 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
28090 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
280a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
280b0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  n accessPayloadC
280c0 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66 66  hecked(pCur, off
280d0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b  set, amt, pBuf);
280e0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
280f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
28100 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  RBLOB */../*.** 
28110 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
28120 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
28130 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
28140 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
28150 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
28160 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
28170 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
28180 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
28190 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
281a0 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
281b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
281c0 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
281d0 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
281e0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
281f0 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
28200 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
28210 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
28220 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
28230 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
28240 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
28250 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
28260 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
28270 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
28280 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
28290 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
282a0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
282b0 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
282c0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
282d0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
282e0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
282f0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
28300 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
28310 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
28320 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
28330 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
28340 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
28350 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
28360 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
28370 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
28380 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
28390 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
283a0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
283b0 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
283c0 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
283d0 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
283e0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
283f0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
28400 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
28410 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
28420 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
28430 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
28440 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
28450 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
28460 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
28470 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
28480 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
28490 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
284a0 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
284b0 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
284c0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
284d0 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
284e0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
284f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
28500 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
28510 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
28520 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
28530 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
28540 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
28550 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
28560 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
28570 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
28580 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
28590 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
285a0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
285b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
285c0 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
285d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
285e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
285f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
28600 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
28610 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
28620 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
28630 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
28640 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
28650 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28660 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  x<pCur->apPage[p
28670 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
28680 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
28690 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
286a0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
286b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
286c0 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65  oad>pCur->apPage
286d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
286e0 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Data || CORRUPT_
286f0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
28700 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
28710 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  oad<pCur->apPage
28720 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
28730 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50  DataEnd ||CORRUP
28740 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28  T_DB);.  amt = (
28750 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67  int)(pCur->apPag
28760 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28770 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
28780 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b  >info.pPayload);
28790 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
287a0 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61  o.nLocal<amt ) a
287b0 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
287c0 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20  nLocal;.  *pAmt 
287d0 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  = amt;.  return 
287e0 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66  (void*)pCur->inf
287f0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  o.pPayload;.}...
28800 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
28810 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
28820 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
28830 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
28840 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
28850 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
28860 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
28870 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
28880 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
28890 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
288a0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
288b0 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
288c0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
288d0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
288e0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
288f0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
28900 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
28910 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
28920 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
28930 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
28940 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
28950 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
28960 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
28970 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
28980 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
28990 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
289a0 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
289b0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
289c0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
289d0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
289e0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
289f0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
28a00 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
28a10 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
28a20 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
28a30 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
28a40 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
28a50 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
28a60 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  adFetch(BtCursor
28a70 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
28a80 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
28a90 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
28aa0 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
28ab0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
28ac0 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
28ad0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
28ae0 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
28af0 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
28b00 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
28b10 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
28b20 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
28b30 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
28b40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
28b50 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
28b60 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
28b70 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
28b80 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
28b90 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
28ba0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
28bb0 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
28bc0 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
28bd0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
28be0 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
28bf0 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
28c00 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
28c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28c20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
28c30 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
28c40 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68  newPgno){.  BtSh
28c50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
28c60 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
28c70 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
28c80 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
28c90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28ca0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28cb0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
28cc0 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
28cd0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
28ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28cf0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
28d00 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
28d10 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
28d20 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
28d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28d40 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
28d50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
28d60 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
28d70 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
28d80 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
28d90 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
28da0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28db0 3e 69 50 61 67 65 2b 2b 5d 20 3d 20 70 43 75 72  >iPage++] = pCur
28dc0 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 69 78  ->ix;.  pCur->ix
28dd0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67   = 0;.  return g
28de0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
28df0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75  t, newPgno, &pCu
28e00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28e10 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e30 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50  pCur, pCur->curP
28e40 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23  agerFlags);.}..#
28e50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
28e60 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
28e70 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
28e80 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
28e90 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
28ea0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
28eb0 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
28ec0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
28ed0 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
28ee0 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
28ef0 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
28f00 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
28f10 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
28f20 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
28f30 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
28f40 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
28f50 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
28f60 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
28f70 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
28f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
28f90 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
28fa0 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
28fb0 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
28fc0 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
28fd0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
28fe0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
28ff0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74   conditions test
29000 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e  ed below might n
29010 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20  ot be true.     
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63         ** in a c
29040 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
29050 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  */.  assert( iId
29060 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
29070 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
29080 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
29090 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
290a0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
290b0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
290c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
290d0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
290e0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
290f0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
29100 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
29110 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
29120 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
29130 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
29140 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
29150 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
29160 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
29170 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
29180 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
29190 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
291a0 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
291b0 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
291c0 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
291d0 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
291e0 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
291f0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
29200 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
29210 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
29220 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
29230 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
29240 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
29250 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
29260 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
29270 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
29280 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
29290 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
292a0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
292b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
292c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
292d0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
292e0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
292f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29300 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29310 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
29320 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
29330 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
29340 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
29350 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
29360 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
29370 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
29380 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29390 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73  >pgno.  );.  tes
293a0 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49  tcase( pCur->aiI
293b0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
293c0 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ] > pCur->apPage
293d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d  [pCur->iPage-1]-
293e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72  >nCell );.  pCur
293f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
29400 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
29410 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
29420 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
29430 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
29440 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  ix = pCur->aiIdx
29450 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
29460 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  .  releasePageNo
29470 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
29480 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
29490 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  ]);.}../*.** Mov
294a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
294b0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
294c0 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
294d0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
294e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
294f0 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
29500 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
29510 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
29520 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
29530 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
29540 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
29550 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
29560 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
29570 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
29580 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
29590 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
295a0 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
295b0 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
295c0 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
295d0 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
295e0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
295f0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
29600 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
29610 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
29620 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
29630 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
29640 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
29650 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
29660 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
29670 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
29680 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
29690 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
296a0 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
296b0 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
296c0 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
296d0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
296e0 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
296f0 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
29700 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
29710 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
29720 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
29730 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
29740 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
29750 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
29760 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
29770 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
29780 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
29790 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
297a0 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
297b0 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
297c0 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
297d0 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
297e0 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
297f0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
29800 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
29810 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
29820 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
29830 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
29840 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
29850 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
29860 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
29870 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
29880 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
29890 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
298a0 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
298b0 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
298c0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
298d0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
298e0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
298f0 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
29900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
29910 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29920 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29930 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
29940 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
29950 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
29960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
29970 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
29980 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
299a0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
299b0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
299c0 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
299d0 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
299e0 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
299f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
29a00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
29a10 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
29a20 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
29a30 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
29a40 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
29a50 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
29a60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
29a70 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
29a80 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
29a90 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
29aa0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
29ab0 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
29ac0 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  do{.        asse
29ad0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
29ae0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30  [pCur->iPage]!=0
29af0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
29b00 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
29b10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29b20 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
29b30 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
29b40 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  >iPage);.      g
29b50 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20  oto skip_init;. 
29b60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29b70 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
29b80 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
29b90 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29ba0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
29bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
29bd0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
29be0 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20  =(-1) );.    rc 
29bf0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
29c00 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
29c10 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
29c20 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
29c30 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
29c50 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
29c60 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
29c70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29c80 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
29c90 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29ca0 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65 74 75  LID;.       retu
29cb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
29cc0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
29cd0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49  ;.    pCur->curI
29ce0 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70  ntKey = pCur->ap
29cf0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b  Page[0]->intKey;
29d00 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
29d10 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
29d20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
29d30 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
29d40 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
29d50 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
29d60 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
29d70 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
29d80 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
29d90 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
29da0 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
29db0 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
29dc0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
29dd0 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
29de0 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
29df0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
29e00 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
29e10 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
29e20 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
29e30 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
29e40 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
29e50 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
29e60 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
29e70 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
29e80 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
29e90 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
29ea0 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
29eb0 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
29ec0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29ed0 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
29ee0 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
29ef0 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
29f00 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
29f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
29f20 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
29f30 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
29f40 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
29f50 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
29f60 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
29f70 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
29f80 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
29f90 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
29fa0 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
29fb0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
29fc0 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
29fd0 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
29fe0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
29ff0 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
2a000 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a010 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
2a020 4f 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  O(pCur->apPage[p
2a030 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
2a040 6f 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e  o);.  }..skip_in
2a050 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78  it:  .  pCur->ix
2a060 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
2a070 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2a080 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2a090 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2a0a0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2a0b0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2a0c0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
2a0d0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66  >apPage[0];.  if
2a0e0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
2a0f0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
2a100 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2a110 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
2a120 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
2a130 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
2a140 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
2a150 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
2a160 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a170 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
2a180 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2a190 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
2a1a0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
2a1b0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
2a1c0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2a1d0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
2a1e0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
2a1f0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
2a200 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2a210 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2a220 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
2a230 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2a240 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2a250 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
2a260 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
2a270 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
2a280 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
2a290 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2a2a0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
2a2b0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
2a2c0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
2a2d0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
2a2e0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
2a2f0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
2a300 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2a310 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
2a320 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a330 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2a340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a350 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2a360 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2a370 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a380 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a390 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a3a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a3b0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2a3c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a3d0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
2a3e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a3f0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
2a400 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a410 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  >ix<pPage->nCell
2a420 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
2a430 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2a440 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  (pPage, pCur->ix
2a450 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
2a460 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2a470 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2a480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a490 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a4a0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
2a4b0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2a4c0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2a4d0 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
2a4e0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2a4f0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
2a500 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
2a510 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
2a520 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
2a530 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2a540 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
2a550 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2a560 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
2a570 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
2a580 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
2a590 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
2a5a0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
2a5b0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
2a5c0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
2a5d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
2a5e0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
2a5f0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2a600 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
2a610 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
2a620 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2a630 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2a640 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a650 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a660 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2a670 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a680 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2a690 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
2a6a0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a6b0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a6c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a6d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a6e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2a6f0 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
2a700 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a710 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
2a720 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2a730 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2a740 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2a750 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
2a760 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2a770 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
2a780 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2a790 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
2a7a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2a7b0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d    }.  pCur->ix =
2a7c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2a7d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a7e0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2a7f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2a800 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a810 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
2a820 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2a830 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
2a840 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2a850 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2a860 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2a870 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2a880 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2a890 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2a8a0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2a8b0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2a8c0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2a8d0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2a8e0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2a8f0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2a900 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
2a910 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a920 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2a930 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2a940 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a950 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a960 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a970 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2a980 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2a990 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
2a9a0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a9b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a9c0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
2a9d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a9e0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
2a9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2aa00 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2aa10 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2aa20 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2aa30 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2aa40 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2aa50 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2aa60 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2aa70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2aa80 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
2aa90 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2aaa0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
2aab0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2aac0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2aad0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2aae0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
2aaf0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2ab00 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2ab10 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2ab20 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2ab30 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2ab40 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2ab50 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2ab60 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2ab70 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2ab80 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2ab90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2aba0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2abb0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2abc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2abd0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2abe0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2abf0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2ac00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ac10 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2ac20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2ac30 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2ac40 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2ac50 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2ac60 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2ac70 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2ac80 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2ac90 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2aca0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2acb0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2acc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2acd0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2ace0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2acf0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2ad00 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2ad10 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2ad20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2ad30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2ad40 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2ad50 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2ad60 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2ad70 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2ad80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2ad90 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2ada0 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2adb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2adc0 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70  ert( pCur->ix==p
2add0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ade0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2adf0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2ae00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2ae10 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2ae20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2ae30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ae40 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2ae50 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2ae60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ae70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
2ae80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2ae90 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2aea0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2aeb0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2aec0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2aed0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2aee0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2aef0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2af00 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2af10 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2af20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2af30 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2af40 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2af50 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2af60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2af70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2af80 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2af90 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2afa0 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
2afb0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2afc0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2afd0 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2afe0 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
2aff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b000 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2b010 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2b020 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2b030 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2b040 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2b050 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2b060 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2b070 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2b080 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2b090 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2b0a0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2b0b0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2b0c0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2b0d0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2b0e0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2b0f0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2b100 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2b110 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2b120 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2b130 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2b140 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2b150 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2b160 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2b170 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2b180 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2b190 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2b1a0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2b1b0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2b1c0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2b1d0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2b1e0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2b1f0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2b200 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2b210 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2b220 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2b230 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2b240 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2b250 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2b260 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2b270 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2b280 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2b290 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2b2a0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2b2b0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2b2c0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2b2d0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2b2e0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2b2f0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2b300 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2b310 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2b320 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2b330 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2b340 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2b350 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2b360 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2b370 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2b380 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2b390 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2b3a0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2b3b0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2b3c0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2b3e0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2b3f0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2b400 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2b410 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2b420 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2b430 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2b440 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2b450 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2b460 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2b470 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2b480 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2b490 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2b4a0 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2b4b0 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2b4c0 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2b4d0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2b4e0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2b4f0 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2b500 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2b510 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2b520 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2b530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b540 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2b550 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2b560 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2b570 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2b580 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2b590 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2b5a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2b5b0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2b5c0 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2b5d0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2b5e0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2b5f0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2b600 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b620 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2b630 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2b640 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2b650 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2b660 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2b670 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2b680 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2b690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b6a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b6b0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2b6c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2b6d0 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2b6e0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2b6f0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2b700 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
2b710 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b720 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2b730 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
2b740 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
2b750 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
2b760 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
2b770 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
2b780 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
2b790 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
2b7a0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
2b7b0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
2b7c0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
2b7d0 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
2b7e0 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
2b7f0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
2b800 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2b810 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2b820 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2b830 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
2b840 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2b850 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2b860 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2b870 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b880 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2b890 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2b8a0 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
2b8b0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
2b8c0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2b8d0 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20  AtLast)!=0 ){.  
2b8e0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2b8f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b910 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
2b920 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
2b930 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y is one more th
2b940 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
2b950 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  key, then.      
2b960 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68  ** try to get th
2b970 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ere using sqlite
2b980 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74  3BtreeNext() rat
2b990 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a  her than a full.
2b9a0 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20        ** binary 
2b9b0 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73  search.  This is
2b9c0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2b9d0 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72   only.  The corr
2b9e0 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20  ect answer.     
2b9f0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74   ** is still obt
2ba00 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68  ained without th
2ba10 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20  is case, only a 
2ba20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77  little more slow
2ba30 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ely */.      if(
2ba40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2ba50 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70  +1==intKey && !p
2ba60 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
2ba70 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2ba80 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2ba90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2baa0 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  t(pCur, 0);.    
2bab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2bad0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
2bae0 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
2baf0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2bb00 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2bb10 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2bb20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2bb30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bb40 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2bb50 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
2bb60 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2bb70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2bb80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bb90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bba0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2bbb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2bbc0 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
2bbd0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
2bbe0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
2bbf0 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
2bc00 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
2bc10 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
2bc20 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
2bc30 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
2bc40 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2bc50 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
2bc60 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2bc70 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2bc80 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
2bc90 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
2bca0 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
2bcb0 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
2bcc0 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
2bcd0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2bce0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2bcf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2bd00 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2bd10 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2bd20 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2bd30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
2bd40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2bd50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2bd60 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2bd70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
2bd80 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
2bd90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2bda0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
2bdb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2bdc0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2bdd0 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
2bde0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2bdf0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
2be00 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2be10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2be20 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2be30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2be40 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2be50 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
2be60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2be70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2be80 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2be90 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
2bea0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
2beb0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
2bec0 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
2bed0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
2bee0 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
2bef0 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
2bf00 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
2bf10 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2bf20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bf30 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
2bf40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bf50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2bf60 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
2bf70 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
2bf80 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
2bf90 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
2bfa0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
2bfb0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
2bfc0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2bfd0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
2bfe0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
2bff0 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
2c000 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
2c010 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
2c020 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
2c030 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
2c040 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
2c050 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
2c060 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
2c070 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
2c080 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
2c090 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
2c0a0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
2c0b0 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
2c0c0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
2c0d0 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
2c0e0 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
2c0f0 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
2c100 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
2c110 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
2c120 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
2c130 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
2c140 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2c150 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
2c160 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
2c170 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
2c180 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
2c190 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
2c1a0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
2c1b0 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
2c1c0 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
2c1d0 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
2c1e0 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
2c1f0 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
2c200 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
2c210 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2c220 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2c230 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
2c240 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
2c250 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
2c260 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
2c270 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2c280 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2c290 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2c2a0 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69   idx);.        i
2c2b0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2c2c0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2c2d0 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
2c2e0 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
2c2f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2c300 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
2c310 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  taEnd ){.       
2c320 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c330 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
2c340 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
2c350 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c370 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
2c380 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
2c390 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
2c3a0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2c3b0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2c3c0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2c3d0 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
2c3e0 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
2c3f0 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
2c400 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2c410 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
2c420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2c430 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2c440 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2c450 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
2c460 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2c470 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2c480 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
2c490 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
2c4a0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2c4b0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2c4c0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2c4d0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2c4e0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
2c4f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2c500 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2c510 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2c520 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
2c530 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2c540 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
2c550 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2c560 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
2c570 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2c580 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2c590 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
2c5a0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2c5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
2c5c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c5d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2c5f0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2c600 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2c610 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2c620 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2c630 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
2c640 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2c650 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2c660 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20      int nCell;  
2c670 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
2c680 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74  Cell cell in byt
2c690 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  es */.        pC
2c6a0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2c6b0 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2c6c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
2c6d0 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
2c6e0 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
2c6f0 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
2c700 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
2c710 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
2c720 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2c730 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
2c740 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
2c750 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
2c760 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
2c770 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
2c780 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
2c790 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
2c7a0 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
2c7b0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
2c7c0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
2c7d0 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
2c7e0 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
2c7f0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
2c800 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
2c810 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
2c820 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
2c830 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2c840 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
2c850 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
2c860 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
2c870 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
2c880 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
2c890 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
2c8a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
2c8b0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
2c8c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2c8d0 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
2c8e0 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
2c8f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2c900 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
2c910 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2c920 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
2c930 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
2c940 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
2c950 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2c960 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
2c970 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
2c980 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
2c990 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2c9a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c9b0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
2c9c0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2c9d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2c9e0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2c9f0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2ca00 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
2ca10 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2ca20 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
2ca30 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
2ca40 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
2ca50 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
2ca60 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
2ca70 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
2ca80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2ca90 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2caa0 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
2cab0 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
2cac0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
2cad0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
2cae0 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2caf0 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
2cb00 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2cb10 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2cb20 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
2cb30 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2cb40 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2cb50 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2cb60 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
2cb70 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2cb80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cb90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2cba0 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
2cbb0 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
2cbc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2cbd0 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
2cbe0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
2cbf0 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
2cc00 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
2cc10 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
2cc20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2cc30 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2cc40 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
2cc50 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
2cc60 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
2cc70 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
2cc80 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
2cc90 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
2cca0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ed. .          *
2ccb0 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
2ccc0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
2ccd0 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65  corrupt, the xRe
2cce0 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74  cordCompare rout
2ccf0 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20  ine may read.   
2cd00 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20         ** up to 
2cd10 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74  two varints past
2cd20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2cd30 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61  buffer. An extra
2cd40 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a   18 .          *
2cd50 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  * bytes of paddi
2cd60 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ng is allocated 
2cd70 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2cd80 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20  e buffer in.    
2cd90 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
2cda0 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a  is happens.  */.
2cdb0 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
2cdc0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
2cdd0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
2cde0 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
2cdf0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
2ce00 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
2ce10 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
2ce20 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2ce30 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
2ce40 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
2ce50 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
2ce60 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
2ce70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ce80 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20  nCell<0 );   /* 
2ce90 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65  True if key size
2cea0 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65   is 2^32 or more
2ceb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2cec0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30  stcase( nCell==0
2ced0 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2cee0 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2cef0 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20  0x80 0x00 */.   
2cf00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2cf10 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a   nCell==1 );  /*
2cf20 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2cf30 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2cf40 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  01 */.          
2cf50 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2cf60 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =2 );  /* Minimu
2cf70 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65  m legal index ke
2cf80 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  y size */.      
2cf90 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20      if( nCell<2 
2cfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2cfb0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2cfc0 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
2cfd0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
2cfe0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2cff0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2d000 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2d010 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2d020 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2d030 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d040 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2d050 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2d060 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2d070 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2d080 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2d090 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2d0a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2d0b0 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2d0c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
2d0d0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2d0e0 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
2d0f0 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
2d100 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
2d110 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2d120 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
2d130 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Ovfl;.          
2d140 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2d150 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2d160 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
2d170 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2d180 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2d190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d1a0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2d1b0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
2d1c0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
2d1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2d1e0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2d1f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
2d200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20        assert( . 
2d210 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78             (pIdx
2d220 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2d230 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
2d240 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26  c==0).         &
2d250 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  & (pIdxKey->errC
2d260 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ode!=SQLITE_NOME
2d270 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65  M || pCur->pBtre
2d280 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2d290 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  led).        );.
2d2a0 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20          if( c<0 
2d2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2d2c0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2d2d0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20    }else if( c>0 
2d2e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2d2f0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2d300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d310 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20     assert( c==0 
2d320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  );.          *pR
2d330 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2d340 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d350 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2d360 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2d370 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d380 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2d390 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
2d3a0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2d3b0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2d3c0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
2d3d0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2d3e0 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
2d3f0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2d400 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2d410 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2d420 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2d430 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20  (lwr+upr)/2 */. 
2d440 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d450 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
2d460 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
2d470 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2d480 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
2d490 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2d4a0 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
2d4b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d4c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2d4d0 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67  ->ix<pCur->apPag
2d4e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2d4f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  nCell );.      p
2d500 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2d510 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  dx;.      *pRes 
2d520 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
2d530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d540 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2d550 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74  ish;.    }.movet
2d560 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20  o_next_layer:.  
2d570 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65    if( lwr>=pPage
2d580 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
2d590 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2d5a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2d5b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2d5c0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
2d5d0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2d5e0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
2d5f0 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
2d600 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
2d610 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a  >ix = (u16)lwr;.
2d620 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2d630 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
2d640 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
2d650 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65   break;.  }.move
2d660 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75  to_finish:.  pCu
2d670 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2d680 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  0;.  assert( (pC
2d690 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2d6a0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
2d6b0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
2d6c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
2d6d0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
2d6e0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
2d6f0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2d700 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
2d710 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
2d720 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
2d730 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
2d740 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
2d750 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
2d760 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2d770 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
2d780 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
2d790 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
2d7a0 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
2d7b0 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
2d7c0 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
2d7d0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2d7e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
2d7f0 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
2d800 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
2d810 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
2d820 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
2d830 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
2d840 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
2d850 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2d860 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
2d870 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
2d880 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
2d890 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
2d8a0 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
2d8b0 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
2d8c0 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
2d8d0 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
2d8e0 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
2d8f0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
2d900 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20  urn an estimate 
2d910 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  for the number o
2d920 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2d930 62 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ble that pCur is
2d940 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  .** pointing to.
2d950 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2d960 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f  ive number if no
2d970 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72   estimate is cur
2d980 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c  rently .** avail
2d990 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  able..*/.i64 sql
2d9a0 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e  ite3BtreeRowCoun
2d9b0 74 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  tEst(BtCursor *p
2d9c0 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  Cur){.  i64 n;. 
2d9d0 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74   u8 i;..  assert
2d9e0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d9f0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2da00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2da10 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2da20 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2da30 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72  ex) );..  /* Cur
2da40 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65  rently this inte
2da50 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61  rface is only ca
2da60 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49  lled by the OP_I
2da70 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70  fSmaller.  ** op
2da80 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61  code, and it tha
2da90 74 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f  t case the curso
2daa0 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  r will always be
2dab0 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20   valid and.  ** 
2dac0 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e  will always poin
2dad0 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65  t to a leaf node
2dae0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2daf0 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43  (pCur->eState!=C
2db00 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72  URSOR_VALID) ) r
2db10 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20  eturn -1;.  if( 
2db20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 70 50 61  NEVER(pCur->apPa
2db30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2db40 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75  >leaf==0) ) retu
2db50 72 6e 20 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e 3d  rn -1;..  for(n=
2db60 31 2c 20 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  1, i=0; i<=pCur-
2db70 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
2db80 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50    n *= pCur->apP
2db90 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20  age[i]->nCell;. 
2dba0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
2dbb0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2dbc0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2dbd0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2dbe0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
2dbf0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a  * Return value:.
2dc00 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  **.**    SQLITE_
2dc10 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65 73  OK        succes
2dc20 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44  s.**    SQLITE_D
2dc30 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72 20  ONE      cursor 
2dc40 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
2dc50 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74 20  ing at the last 
2dc60 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74  element.**    ot
2dc70 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20 73  herwise        s
2dc80 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  ome kind of erro
2dc90 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a  r occurred.**.**
2dca0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2dcb0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2dcc0 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2dcd0 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2dce0 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2dcf0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2dd00 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2dd10 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2dd20 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2dd30 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2dd40 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2dd50 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2dd60 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2dd70 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2dd80 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2dd90 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2dda0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2ddb0 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2ddc0 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2ddd0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2dde0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20  r..**.** If bit 
2ddf0 30 78 30 31 20 6f 66 20 74 68 65 20 66 6c 61 67  0x01 of the flag
2de00 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 31 2c  s argument is 1,
2de10 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2de20 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 0a   corresponds to.
2de30 2a 2a 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  ** an SQL index 
2de40 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
2de50 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2de60 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
2de70 53 51 4c 20 69 6e 64 65 78 0a 2a 2a 20 68 61 64  SQL index.** had
2de80 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69   been a unique i
2de90 6e 64 65 78 2e 20 20 54 68 65 20 66 6c 61 67 73  ndex.  The flags
2dea0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68   argument is a h
2deb0 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
2dec0 6d 65 6e 74 2e 0a 2a 2a 20 53 51 4c 69 74 65 20  ment..** SQLite 
2ded0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2dee0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73  tion does not us
2def0 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74  e this hint, but
2df00 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f   COMDB2 does..*/
2df10 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2df20 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2df30 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2df40 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29  pCur, int flags)
2df50 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2df60 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2df70 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2df80 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2df90 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2dfa0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dfb0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2dfc0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2dfd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2dfe0 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
2dff0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2e000 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2e010 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
2e020 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2e030 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2e040 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  vfl)==0 );.    r
2e050 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2e060 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2e070 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2e080 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2e0a0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2e0b0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2e0c0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72  State ){.      r
2e0d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
2e0e0 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  E;.    }.    if(
2e0f0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2e100 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2e110 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2e120 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2e130 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2e140 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2e150 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2e160 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2e170 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2e180 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
2e190 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2e1a0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2e1b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e1c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2e1d0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2e1e0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2e1f0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2e200 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e210 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
2e220 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 61   ++pCur->ix;.  a
2e230 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2e240 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
2e250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e260 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
2e270 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
2e280 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
2e290 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
2e2a0 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
2e2b0 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
2e2c0 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
2e2d0 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
2e2e0 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
2e2f0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
2e300 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
2e310 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
2e320 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
2e330 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
2e340 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
2e350 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
2e360 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
2e370 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
2e380 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
2e390 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
2e3a0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
2e3b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2e3c0 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
2e3d0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2e3e0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2e3f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
2e400 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2e410 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2e420 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2e430 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2e440 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2e450 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
2e460 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2e470 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2e480 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
2e490 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2e4a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
2e4b0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2e4c0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2e4d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e4e0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
2e4f0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2e500 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
2e510 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e520 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e530 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
2e540 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d  pCur->ix>=pPage-
2e550 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
2e560 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2e570 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e580 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2e590 28 70 43 75 72 2c 20 66 6c 61 67 73 29 3b 0a 20  (pCur, flags);. 
2e5a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e5b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e5c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2e5d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2e5e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e5f0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2e600 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2e610 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2e620 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
2e630 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
2e640 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2e650 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67  flags){.  MemPag
2e660 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
2e670 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2e680 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2e690 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
2e6a0 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
2e6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2e6c0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2e6d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2e6e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2e6f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e700 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2e710 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2e720 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2e730 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69  _ValidOvfl);.  i
2e740 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2e750 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
2e760 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2e770 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 70 50 61  (pCur, 0);.  pPa
2e780 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2e790 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2e7a0 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69    if( (++pCur->i
2e7b0 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x)>=pPage->nCell
2e7c0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78   ){.    pCur->ix
2e7d0 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62  --;.    return b
2e7e0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2e7f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2e800 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2e810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e820 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2e830 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2e840 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2e850 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2e860 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2e870 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2e880 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2e890 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52  e database..** R
2e8a0 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a  eturn values:.**
2e8b0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
2e8c0 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a  K     success.**
2e8d0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45       SQLITE_DONE
2e8e0 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73     the cursor is
2e8f0 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20   already on the 
2e900 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
2e910 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
2e920 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
2e930 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
2e940 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
2e950 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2e960 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2e970 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2e980 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2e990 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2e9a0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2e9b0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2e9c0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2e9d0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2e9e0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2e9f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2ea00 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2ea10 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2ea20 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2ea30 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2ea40 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2ea50 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2ea60 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2ea70 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2ea80 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2ea90 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2eaa0 2a 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20  **.**.** If bit 
2eab0 30 78 30 31 20 6f 66 20 74 68 65 20 66 6c 61 67  0x01 of the flag
2eac0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 31 2c  s argument is 1,
2ead0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2eae0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 0a   corresponds to.
2eaf0 2a 2a 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  ** an SQL index 
2eb00 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
2eb10 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2eb20 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
2eb30 53 51 4c 20 69 6e 64 65 78 0a 2a 2a 20 68 61 64  SQL index.** had
2eb40 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69   been a unique i
2eb50 6e 64 65 78 2e 20 20 54 68 65 20 66 6c 61 67 73  ndex.  The flags
2eb60 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68   argument is a h
2eb70 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
2eb80 6d 65 6e 74 2e 0a 2a 2a 20 53 51 4c 69 74 65 20  ment..** SQLite 
2eb90 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2eba0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73  tion does not us
2ebb0 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74  e this hint, but
2ebc0 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f   COMDB2 does..*/
2ebd0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2ebe0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2ebf0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2ec00 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c  or *pCur, int fl
2ec10 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
2ec20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2ec30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2ec40 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2ec50 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ec60 74 28 20 66 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  t( flags==0 );. 
2ec70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2ec80 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2ec90 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2eca0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2ecb0 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2ecc0 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74  Flags & (BTCF_At
2ecd0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
2ece0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
2ecf0 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ey))==0 );.  ass
2ed00 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2ed10 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nSize==0 );.  if
2ed20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2ed30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2ed40 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2ed50 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2ed60 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2ed70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ed80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ed90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2eda0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2edb0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2edc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2edd0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
2ede0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2edf0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2ee00 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2ee10 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2ee20 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2ee30 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2ee40 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2ee50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2ee60 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2ee70 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2ee80 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
2ee90 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2eea0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2eeb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2eec0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2eed0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2eee0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2eef0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2ef00 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2ef10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2ef20 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
2ef30 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2ef40 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
2ef50 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20  r->ix;.    rc = 
2ef60 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2ef70 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
2ef80 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
2ef90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2efa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2efb0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2efc0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
2efd0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
2efe0 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20  Cur->ix==0 ){.  
2eff0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2f000 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2f010 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f020 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2f030 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f040 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2f050 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2f060 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2f070 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2f080 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2f090 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
2f0a0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2f0b0 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
2f0c0 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
2f0d0 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
2f0e0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2f0f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2f100 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
2f110 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2f120 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f130 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f140 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
2f150 43 75 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Cur, flags);.   
2f160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2f170 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f180 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2f190 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
2f1a0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2f1b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2f1c0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
2f1d0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2f1e0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2f1f0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
2f200 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
2f210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2f220 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2f230 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2f240 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2f250 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2f260 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
2f270 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2f280 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2f290 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2f2a0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
2f2b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2f2c0 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
2f2d0 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20  | pCur->ix==0.  
2f2e0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2f2f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
2f300 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  eaf==0.  ){.    
2f310 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76  return btreePrev
2f320 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20  ious(pCur, 0);. 
2f330 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b   }.  pCur->ix--;
2f340 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2f350 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
2f360 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2f370 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
2f380 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2f390 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
2f3a0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2f3b0 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
2f3c0 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
2f3d0 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
2f3e0 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
2f3f0 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
2f400 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
2f410 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
2f420 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
2f430 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
2f440 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
2f450 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
2f460 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2f470 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
2f480 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
2f490 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
2f4a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2f4b0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
2f4c0 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
2f4d0 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
2f4e0 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
2f4f0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
2f500 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65  to NULL in the e
2f510 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
2f520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2f530 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2f540 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2f550 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2f560 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2f570 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2f580 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2f590 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2f5a0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2f5b0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2f5c0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2f5d0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2f5e0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2f5f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2f600 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2f610 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2f620 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2f630 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2f640 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2f650 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2f660 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2f670 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2f680 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2f690 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2f6a0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2f6b0 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2f6c0 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2f6d0 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2f6e0 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2f6f0 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2f700 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2f710 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2f720 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2f730 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2f740 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2f750 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2f760 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2f770 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2f780 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2f790 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2f7a0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2f7b0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2f7c0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2f7d0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2f7e0 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2f7f0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2f800 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2f810 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2f820 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2f830 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2f840 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2f850 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2f860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2f870 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2f880 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2f890 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2f8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2f8b0 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2f8c0 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2f8d0 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2f8e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2f8f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2f900 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2f910 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2f920 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2f930 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2f940 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2f950 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2f960 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2f970 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2f980 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2f990 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2f9a0 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2f9b0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2f9c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f9d0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2f9e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2f9f0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2fa00 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2fa10 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2fa20 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2fa30 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2fa40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2fa50 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2fa60 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2fa70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2fa80 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a  count(pBt);.  /*
2fa90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2faa0 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20  05119-02637 The 
2fab0 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2fac0 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2fad0 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72  set 36.  ** stor
2fae0 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f  es stores the to
2faf0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2fb00 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2fb10 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65  ist. */.  n = ge
2fb20 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2fb30 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
2fb40 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
2fb50 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
2fb60 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
2fb70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2fb80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
2fb90 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
2fba0 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
2fbb0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2fbc0 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
2fbd0 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
2fbe0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
2fbf0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
2fc00 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
2fc10 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
2fc20 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
2fc30 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
2fc40 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
2fc50 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
2fc60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2fc70 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
2fc80 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2fc90 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2fca0 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2fcb0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2fcc0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2fcd0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2fce0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2fcf0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2fd00 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2fd10 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2fd20 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2fd30 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2fd40 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2fd50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2fd60 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2fd70 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2fd80 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2fd90 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2fda0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2fdb0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2fdc0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2fdd0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2fde0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2fdf0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2fe00 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2fe10 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2fe20 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2fe30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2fe40 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2fe50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2fe60 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2fe70 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2fe80 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2fe90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2fea0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2feb0 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2fec0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2fed0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2fee0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2fef0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2ff00 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2ff10 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2ff20 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2ff30 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2ff40 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2ff50 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2ff60 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2ff70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ff80 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2ff90 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2ffa0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2ffb0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2ffc0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2ffd0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2ffe0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2fff0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
30000 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
30010 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
30020 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
30030 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
30040 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
30050 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
30060 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
30070 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
30080 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
30090 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
300a0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
300b0 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
300c0 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
300d0 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
300e0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
300f0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
30100 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
30110 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
30120 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
30130 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
30140 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
30150 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
30160 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
30170 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
30180 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
30190 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
301a0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
301b0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
301c0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
301d0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
301e0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
301f0 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
30200 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
30210 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
30220 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
30230 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
30240 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
30250 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30260 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
30270 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
30280 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
30290 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
302a0 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
302b0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
302c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
302d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
302e0 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
302f0 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
30300 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
30310 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
30320 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
30330 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
30340 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
30350 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30360 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
30370 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
30380 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
30390 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b  Page || nSearch+
303a0 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20  + > n ){.       
303b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
303c0 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54  RUPT_PGNO(pPrevT
303d0 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e  runk ? pPrevTrun
303e0 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20  k->pgno : 1);.  
303f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30400 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
30410 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
30420 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
30430 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
30440 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
30450 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
30460 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
30470 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
30490 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30  ssert( pTrunk!=0
304a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
304b0 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21  ( pTrunk->aData!
304c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 );.      /* E
304d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33  VIDENCE-OF: R-13
304e0 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65  523-04394 The se
304f0 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20  cond integer on 
30500 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
30510 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
30520 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
30530 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65  leaf page pointe
30540 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f  rs to follow. */
30550 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
30560 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
30570 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
30580 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
30590 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
305a0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
305b0 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
305c0 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
305d0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
305e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
305f0 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
30600 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
30610 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
30620 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
30630 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
30640 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
30650 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
30660 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
30670 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30680 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
30690 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
306a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
306b0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
306c0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
306d0 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
306e0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
306f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
30700 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
30710 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30720 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
30730 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
30740 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
30750 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
30760 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
30770 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
30780 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
30790 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
307a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
307b0 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
307c0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
307d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
307e0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
307f0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
30800 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
30810 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30820 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
30830 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (iTrunk);.      
30840 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30850 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
30860 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30870 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
30880 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
30890 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
308a0 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
308b0 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
308c0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
308d0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
308e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
308f0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
30900 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
30910 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
30920 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
30930 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
30940 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
30950 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
30960 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
30970 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
30980 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
30990 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
309a0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
309b0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
309c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
309d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
309e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
309f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
30a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
30a10 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30a20 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
30a30 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
30a40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
30a50 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
30a60 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
30a70 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
30a80 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
30a90 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
30aa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30ab0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30ac0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30ad0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
30ae0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30af0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30b10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30b20 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30b30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30b40 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
30b50 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
30b60 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
30b70 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
30b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30ba0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
30bb0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
30bc0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
30bd0 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
30be0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
30bf0 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
30c00 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
30c10 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
30c20 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
30c30 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
30c40 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
30c50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30c60 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
30c70 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
30c80 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
30c90 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
30ca0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
30cb0 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
30cc0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
30cd0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30ce0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30cf0 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
30d00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
30d10 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
30d20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30d30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30d40 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
30d50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
30d60 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30d70 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e  usedPage(pBt, iN
30d80 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
30d90 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
30da0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30dc0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30dd0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30df0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30e00 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
30e10 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
30e20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30e40 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
30e50 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
30e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
30e70 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30e80 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
30e90 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
30ea0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
30eb0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
30ec0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
30ed0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
30ee0 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
30ef0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
30f00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
30f10 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
30f20 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
30f30 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
30f40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
30f50 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
30f60 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
30f70 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
30f80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
30f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
30fa0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
30fb0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
30fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
30fd0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
30fe0 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
30ff0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
31000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31020 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
31030 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
31040 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31050 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
31060 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31070 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
31080 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31090 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
310a0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
310b0 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
310c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
310d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
310e0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
310f0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
31100 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
31110 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
31120 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
31130 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
31140 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
31150 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
31160 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
31170 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
31180 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
31190 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
311a0 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
311b0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
311c0 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
311d0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
311e0 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
311f0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
31200 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
31210 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
31220 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
31230 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
31240 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
31250 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
31260 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20            iPage 
31270 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
31280 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20  a[8+i*4]);.     
31290 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61           if( iPa
312a0 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge<=nearby ){.  
312b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
312c0 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
312d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
312e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
312f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
31300 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
31310 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
31320 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
31330 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
31340 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
31350 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
31360 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
31370 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
31380 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
31390 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
313a0 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
313b0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
313c0 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
313d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
313e0 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
313f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31400 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
31420 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
31430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31440 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31450 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
31460 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
31470 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
31480 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
31490 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
314a0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
314b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
314c0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
314d0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
314e0 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
314f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31500 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
31510 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
31520 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31530 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31550 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
31560 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
31570 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
31580 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
31590 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
315a0 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
315b0 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
315c0 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
315d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
315e0 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
315f0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
31600 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
31610 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
31620 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
31630 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
31640 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
31650 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
31660 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
31670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31680 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
31690 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
316a0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
316b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
316c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
316d0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
316e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
316f0 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
31700 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
31710 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
31720 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
31730 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
31740 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
31750 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
31760 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31770 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
31780 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
31790 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
317a0 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
317b0 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
317c0 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f   *pPgno)? PAGER_
317d0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
317e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
317f0 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
31800 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
31810 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
31820 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
31830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
31850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31860 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
31870 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
31880 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
318a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
318b0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
318c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
318d0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
318e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
318f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31900 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
31910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31920 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
31930 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
31940 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
31950 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
31960 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
31970 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
31980 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
31990 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
319a0 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
319b0 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
319c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
319d0 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
319e0 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
319f0 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
31a00 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
31a10 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
31a20 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
31a30 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
31a40 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
31a50 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
31a60 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
31a70 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
31a80 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
31a90 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
31aa0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
31ab0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
31ac0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
31ad0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
31ae0 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
31af0 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
31b00 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
31b10 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
31b20 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
31b30 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
31b40 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
31b50 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
31b60 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
31b70 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
31b80 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
31b90 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
31ba0 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
31bb0 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
31bc0 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
31bd0 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
31be0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
31bf0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
31c00 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
31c10 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
31c20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
31c30 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
31c40 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
31c50 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
31c60 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
31c70 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
31c80 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
31c90 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
31ca0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
31cb0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
31cc0 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
31cd0 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
31ce0 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
31cf0 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
31d00 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
31d10 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
31d20 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
31d30 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
31d40 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
31d50 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
31d60 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
31d70 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
31d80 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
31d90 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
31da0 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
31db0 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
31dc0 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45  cate))? PAGER_GE
31dd0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a  T_NOCONTENT:0;..
31de0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31df0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
31e00 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
31e10 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
31e20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42  eturn rc;.    pB
31e30 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
31e40 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
31e50 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31e60 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
31e70 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20  age++;..#ifndef 
31e80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31e90 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
31ea0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
31eb0 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
31ec0 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  pBt, pBt->nPage)
31ed0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
31ee0 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
31ef0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
31f00 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
31f10 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
31f20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
31f30 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
31f40 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
31f50 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
31f60 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
31f70 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
31f80 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
31f90 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
31fa0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
31fb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
31fc0 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
31fd0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
31fe0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
31ff0 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
32000 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
32010 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29  n", pBt->nPage))
32020 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32030 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44  pBt->nPage!=PEND
32040 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
32050 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
32060 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
32070 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
32080 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f  age, &pPg, bNoCo
32090 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ntent);.      if
320a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
320b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
320c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
320d0 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
320e0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
320f0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
32100 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
32110 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32120 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
32130 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
32140 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
32150 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
32160 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
32170 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
32180 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
32190 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
321a0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
321b0 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
321c0 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
321d0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
321e0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
321f0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
32200 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
32210 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
32220 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
32230 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
32240 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
32250 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
32260 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
32270 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
32280 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
32290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
322a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
322b0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
322c0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
322d0 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
322e0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
322f0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
32300 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
32310 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
32320 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
32330 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
32340 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
32350 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
32360 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
32370 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
32380 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
32390 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
323a0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
323b0 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
323c0 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20  pDbPage)<=1 );. 
323d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
323e0 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61  ITE_OK || (*ppPa
323f0 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
32400 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
32410 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
32420 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
32430 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
32440 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
32450 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
32460 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
32470 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
32480 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
32490 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
324a0 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
324b0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
324c0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
324d0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
324e0 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
324f0 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
32500 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
32510 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
32520 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
32530 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
32540 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
32550 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
32560 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
32570 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
32580 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
32590 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
325a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
325b0 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
325c0 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
325d0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
325e0 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
325f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
32600 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
32610 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
32620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32630 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
32640 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
32650 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
32660 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
32670 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32690 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
326a0 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
326b0 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
326c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326d0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
326e0 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
326f0 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
32700 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
32710 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
32720 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
32730 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
32740 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
32750 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
32760 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
32770 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
32780 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
32790 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
327a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
327c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
327d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
327f0 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
32800 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
32810 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
32820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
32830 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
32840 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
32850 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e  UPT_DB || iPage>
32860 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
32870 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
32880 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
32890 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67  e );..  if( iPag
328a0 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e<2 ) return SQL
328b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
328c0 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ;.  if( pMemPage
328d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
328e0 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
328f0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
32900 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
32910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
32920 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
32930 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
32940 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
32950 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
32960 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
32970 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
32980 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32990 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
329a0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
329b0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
329c0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
329d0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
329e0 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
329f0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
32a00 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
32a10 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
32a20 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
32a30 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
32a40 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65  /* If the secure
32a50 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69  _delete option i
32a60 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
32a70 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75      ** always fu
32a80 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
32a90 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
32aa0 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
32ab0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
32ac0 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62  Page && ((rc = b
32ad0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
32ae0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
32af0 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c  0))!=0) ).     |
32b00 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72  |            ((r
32b10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32b20 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
32b30 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29  Page))!=0).    )
32b40 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
32b50 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
32b60 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
32b70 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
32b80 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
32b90 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
32ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
32bb0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
32bc0 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
32bd0 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
32be0 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
32bf0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
32c00 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
32c10 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
32c20 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
32c30 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
32c40 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
32c50 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
32c60 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
32c70 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
32c80 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
32c90 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
32ca0 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
32cb0 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
32cc0 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
32cd0 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
32ce0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
32cf0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
32d00 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
32d10 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
32d20 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
32d30 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
32d40 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
32d50 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
32d60 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
32d70 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
32d80 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
32d90 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
32da0 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
32db0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
32dc0 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
32dd0 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
32de0 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
32df0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
32e00 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
32e10 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
32e20 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
32e30 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
32e40 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
32e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
32e60 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
32e70 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
32e80 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
32e90 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
32ea0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
32eb0 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
32ec0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
32ed0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
32ee0 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
32ef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32f00 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
32f10 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
32f20 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
32f30 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
32f40 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
32f50 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
32f60 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
32f70 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
32f80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
32f90 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
32fa0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
32fb0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
32fc0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32fd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
32fe0 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
32ff0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
33000 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
33010 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
33020 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
33030 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
33040 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
33050 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
33060 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
33070 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
33080 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
33090 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
330a0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
330b0 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
330c0 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
330d0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
330e0 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
330f0 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
33100 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
33110 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
33120 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
33130 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
33140 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
33150 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
33160 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
33170 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
33180 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
33190 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
331a0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
331b0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
331c0 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
331d0 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
331e0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
331f0 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
33200 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
33210 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
33220 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
33230 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
33240 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
33250 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
33260 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
33270 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
33280 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
33290 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
332a0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
332b0 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
332c0 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
332d0 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
332e0 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
332f0 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
33300 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
33310 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
33320 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
33330 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
33340 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
33350 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
33360 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
33370 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d  NCE-OF: R-19920-
33380 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e  11576 However, n
33390 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
333a0 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20   SQLite still.  
333b0 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69      ** avoid usi
333c0 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20  ng the last six 
333d0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66  entries in the f
333e0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
333f0 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20  ge array in.    
33400 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20    ** order that 
33410 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
33420 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20  reated by newer 
33430 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
33440 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  te can be.      
33450 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72  ** read by older
33460 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
33470 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ite..      */.  
33480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33490 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
334a0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
334b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
334c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
334d0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
334e0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
334f0 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
33500 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
33510 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
33520 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
33530 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
33540 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
33550 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
33560 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
33570 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
33580 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
33590 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
335a0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
335b0 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
335c0 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
335d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
335e0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
335f0 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
33600 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
33610 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
33620 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
33630 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
33640 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
33650 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
33660 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
33670 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
33680 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
33690 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
336a0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
336b0 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
336c0 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
336d0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
336e0 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
336f0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
33700 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
33710 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
33720 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
33730 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
33740 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
33750 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
33760 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
33770 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
33780 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
33790 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
337a0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
337b0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
337c0 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
337d0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
337e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
337f0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
33800 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
33810 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
33820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33830 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
33840 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
33850 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33860 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
33870 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
33880 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
33890 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
338a0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
338b0 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
338c0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
338d0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
338e0 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
338f0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
33900 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
33910 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
33920 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
33930 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
33940 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
33950 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
33960 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
33970 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
33980 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
33990 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
339a0 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
339b0 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
339c0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
339d0 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
339e0 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
339f0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
33a00 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
33a10 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
33a20 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
33a30 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
33a40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
33a50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
33a60 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20  he given Cell.  
33a70 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  Write the.** loc
33a80 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68  al Cell size (th
33a90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
33aa0 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  s on the origina
33ab0 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67  l page, omitting
33ac0 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e  .** overflow) in
33ad0 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73  to *pnSize..*/.s
33ae0 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
33af0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
33b00 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
33b10 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
33b20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65   contains the Ce
33b30 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
33b40 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
33b50 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
33b60 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  f the Cell */.  
33b70 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
33b80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
33b90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
33ba0 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  ut the cell */.)
33bb0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
33bc0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
33bd0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
33be0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
33bf0 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
33c00 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
33c10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33c20 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
33c30 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
33c40 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
33c50 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
33c60 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , pInfo);.  if( 
33c70 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70  pInfo->nLocal==p
33c80 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29  Info->nPayload )
33c90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33ca0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
33cb0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
33cc0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
33cd0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
33ce0 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
33cf0 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20 3e  pInfo->nSize-1 >
33d00 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50   pPage->aData+pP
33d10 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b  age->maskPage ){
33d20 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  .    /* Cell ext
33d30 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
33d40 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 65 74   page */.    ret
33d50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
33d60 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
33d70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c  gno);.  }.  ovfl
33d80 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
33d90 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e  pCell + pInfo->n
33da0 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73 73  Size - 4);.  ass
33db0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
33dc0 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
33dd0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
33de0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
33df0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e  ;.  nOvfl = (pIn
33e00 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70  fo->nPayload - p
33e10 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f  Info->nLocal + o
33e20 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
33e30 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
33e40 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30   assert( nOvfl>0
33e50 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50   || .    (CORRUP
33e60 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e  T_DB && (pInfo->
33e70 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50  nPayload + ovflP
33e80 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67  ageSize)<ovflPag
33e90 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68  eSize).  );.  wh
33ea0 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
33eb0 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
33ec0 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
33ed0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
33ee0 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
33ef0 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
33f00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
33f10 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
33f20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
33f30 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
33f40 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
33f50 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
33f60 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
33f70 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
33f80 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
33f90 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
33fa0 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
33fb0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
33fc0 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
33fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
33fe0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
33ff0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
34000 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
34010 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
34020 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
34030 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
34040 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34050 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
34060 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
34070 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
34080 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
34090 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
340a0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
340b0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
340c0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
340d0 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
340e0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
340f0 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
34100 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
34110 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
34120 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
34130 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
34140 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
34150 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
34160 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
34170 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
34180 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
34190 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
341a0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
341b0 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
341c0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
341d0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
341e0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
341f0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
34200 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
34210 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
34220 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
34230 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
34240 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
34250 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
34260 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
34270 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
34280 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
34290 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
342a0 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
342b0 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
342c0 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
342d0 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
342e0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
342f0 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
34300 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
34310 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
34320 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
34330 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
34340 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
34350 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
34360 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34370 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
34380 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
34390 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
343a0 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
343b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
343c0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
343d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
343e0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
343f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
34400 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34410 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
34420 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
34430 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
34440 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
34450 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
34460 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
34470 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
34480 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
34490 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
344a0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
344b0 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
344c0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
344d0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
344e0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
344f0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
34500 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
34510 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
34520 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
34530 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
34540 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
34550 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
34560 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
34570 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
34580 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
34590 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
345a0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
345b0 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
345c0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
345d0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
345e0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
345f0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
34600 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
34610 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
34620 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
34630 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
34640 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
34650 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
34660 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
34670 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
34680 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
34690 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
346a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
346b0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
346c0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
346d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
346e0 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c   const BtreePayl
346f0 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20  oad *pX,        
34700 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20  /* Payload with 
34710 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
34720 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ct the cell */. 
34730 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
34740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34750 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
34760 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
34770 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
34780 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
34790 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
347a0 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
347b0 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
347c0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
347d0 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
347e0 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
347f0 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
34800 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
34810 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
34820 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
34830 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
34840 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
34850 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
34860 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
34870 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
34880 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
34890 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
348a0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
348b0 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
348c0 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
348d0 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
348e0 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
348f0 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
34900 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
34910 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
34920 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
34930 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
34940 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
34950 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
34960 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
34970 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
34980 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
34990 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
349a0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
349b0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70  */.  nHeader = p
349c0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
349d0 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ze;.  if( pPage-
349e0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
349f0 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44  Payload = pX->nD
34a00 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b  ata + pX->nZero;
34a10 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e  .    pSrc = pX->
34a20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
34a30 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20  = pX->nData;.   
34a40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34a50 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a  intKeyLeaf ); /*
34a60 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
34a70 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65  ly called for le
34a80 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61  aves */.    nHea
34a90 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
34aa0 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
34ab0 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
34ac0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
34ad0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
34ae0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
34af0 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65  &pX->nKey);.  }e
34b00 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
34b10 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66   pX->nKey<=0x7ff
34b20 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65  fffff && pX->pKe
34b30 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63  y!=0 );.    nSrc
34b40 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69   = nPayload = (i
34b50 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20  nt)pX->nKey;.   
34b60 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79   pSrc = pX->pKey
34b70 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  ;.    nHeader +=
34b80 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
34b90 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
34ba0 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a  ayload);.  }.  .
34bb0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
34bc0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66   payload */.  if
34bd0 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
34be0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
34bf0 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b     n = nHeader +
34c00 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74   nPayload;.    t
34c10 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b  estcase( n==3 );
34c20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
34c30 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==4 );.    if( n
34c40 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20  <4 ) n = 4;.    
34c50 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  *pnSize = n;.   
34c60 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61   spaceLeft = nPa
34c70 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f  yload;.    pPrio
34c80 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c  r = pCell;.  }el
34c90 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d  se{.    int mn =
34ca0 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
34cb0 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28  ;.    n = mn + (
34cc0 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25  nPayload - mn) %
34cd0 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
34ce0 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
34cf0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
34d00 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
34d10 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
34d20 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
34d30 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
34d40 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c   n > pPage->maxL
34d50 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20  ocal ) n = mn;. 
34d60 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
34d70 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
34d80 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b  n + nHeader + 4;
34d90 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70  .    pPrior = &p
34da0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b  Cell[nHeader+n];
34db0 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20  .  }.  pPayload 
34dc0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
34dd0 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  ];..  /* At this
34de0 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
34df0 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
34e00 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
34e10 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
34e20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
34e30 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
34e40 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
34e50 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
34e60 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
34e70 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
34e80 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
34e90 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
34ea0 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
34eb0 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
34ec0 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
34ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ee0 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
34ef0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
34f00 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
34f10 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
34f20 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
34f30 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
34f40 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
34f50 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
34f60 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
34f70 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
34f80 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
34f90 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
34fa0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
34fb0 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
34fc0 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
34fd0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
34fe0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
34ff0 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
35000 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
35010 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
35020 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
35030 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
35040 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
35050 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
35060 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
35070 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
35080 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69  ert( nHeader==(i
35090 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
350a0 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
350b0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
350c0 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b  Key==pX->nKey );
350d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e  .    assert( *pn
350e0 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69  Size == info.nSi
350f0 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
35100 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69  ( spaceLeft == i
35110 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20  nfo.nLocal );.  
35120 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57  }.#endif..  /* W
35130 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64  rite the payload
35140 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
35150 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74  Cell and any ext
35160 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ra into overflow
35170 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c   pages */.  whil
35180 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
35190 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
351a0 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
351b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
351c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
351d0 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
351e0 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
351f0 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
35200 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
35210 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
35220 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
35230 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
35240 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
35250 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
35260 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
35270 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
35280 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
35290 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
352a0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
352b0 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
352c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
352d0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
352e0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
352f0 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
35300 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
35310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35320 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
35330 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
35340 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
35350 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
35360 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
35370 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
35380 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
35390 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
353a0 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
353b0 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
353c0 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
353d0 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
353e0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
353f0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
35400 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
35410 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
35420 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
35430 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
35440 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
35450 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
35460 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
35470 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
35480 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
35490 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
354a0 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
354b0 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
354c0 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
354d0 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
354e0 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  he uninitialized
354f0 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
35500 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
35510 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
35520 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
35530 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
35540 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
35550 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
35560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
35570 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
35580 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
35590 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
355a0 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
355b0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
355c0 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
355d0 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
355e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
355f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
35600 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
35610 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35620 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
35630 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35640 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35650 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
35660 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35670 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
35680 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
35690 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
356a0 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
356b0 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
356c0 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
356d0 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
356e0 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
356f0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
35700 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
35710 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
35720 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
35730 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
35740 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
35750 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
35760 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
35770 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
35780 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
35790 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
357a0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
357b0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
357c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
357d0 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
357e0 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
357f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
35800 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
35810 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
35820 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35830 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
35840 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
35850 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
35860 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
35870 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
35880 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
35890 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
358a0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
358b0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
358c0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
358d0 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
358e0 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
358f0 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
35900 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
35910 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35920 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
35930 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
35940 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
35950 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
35960 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
35970 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
35980 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
35990 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
359a0 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
359b0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
359c0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
359d0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
359e0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
359f0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
35a00 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
35a10 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35a20 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
35a30 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
35a40 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
35a50 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
35a60 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
35a70 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
35a80 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
35a90 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
35aa0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
35ab0 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
35ac0 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
35ad0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
35ae0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
35af0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
35b00 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
35b10 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
35b20 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
35b30 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
35b40 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
35b50 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
35b60 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
35b70 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
35b80 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
35b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35ba0 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
35bb0 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
35bc0 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
35bd0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
35be0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
35bf0 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
35c00 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
35c10 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c   -= n;.  }.  rel
35c20 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
35c30 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
35c40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
35c50 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
35c60 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
35c70 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
35c80 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
35c90 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
35ca0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
35cb0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
35cc0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
35cd0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
35ce0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
35cf0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
35d00 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
35d10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
35d20 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
35d30 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
35d40 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
35d50 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
35d60 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
35d70 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
35d80 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
35d90 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
35da0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
35db0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
35dc0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
35dd0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
35de0 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
35df0 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
35e00 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
35e10 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
35e20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
35e30 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
35e40 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
35e50 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
35e60 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
35e70 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
35e80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
35e90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
35ea0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
35eb0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
35ec0 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
35ed0 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
35ee0 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
35ef0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
35f00 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
35f10 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
35f20 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
35f30 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
35f40 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
35f50 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
35f60 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
35f70 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
35f80 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
35f90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35fa0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
35fb0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
35fc0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
35fd0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
35fe0 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
35ff0 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
36000 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
36010 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
36020 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
36030 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
36040 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
36050 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
36060 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
36070 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
36080 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
36090 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
360a0 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
360b0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
360c0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
360d0 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
360e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
360f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
36100 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
36110 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
36120 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
36130 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
36140 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
36150 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
36160 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
36170 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
36180 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
36190 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
361a0 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
361b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
361c0 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
361d0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
361e0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
361f0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
36200 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
36210 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
36220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36230 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
36240 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
36250 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
36260 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
36270 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
36280 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
36290 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
362a0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
362b0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
362c0 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
362d0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
362e0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
362f0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
36300 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
36310 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
36320 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
36330 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
36340 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
36350 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
36360 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
36370 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
36380 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
36390 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
363a0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
363b0 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
363c0 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
363d0 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
363e0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
363f0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
36400 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
36410 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
36420 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
36430 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
36440 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
36450 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
36460 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
36470 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
36480 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
36490 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
364a0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
364b0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
364c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
364d0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
364e0 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20  **.** *pRC must 
364f0 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  be SQLITE_OK whe
36500 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
36510 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
36520 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
36530 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
36540 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
36550 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
36560 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
36570 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
36580 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
36590 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
365a0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
365b0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
365c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
365d0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
365e0 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
365f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
36600 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
36610 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
36620 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
36630 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
36640 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
36650 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
36660 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
36670 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
36680 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
36690 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
366a0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
366b0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
366c0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
366d0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
366e0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
366f0 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
36700 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
36710 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
36720 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
36730 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
36740 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
36750 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  r */.  u8 *data;
36760 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36770 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
36780 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
36790 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20  8 *pIns;        
367a0 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e   /* The point in
367b0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
367c0 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c  [] where no cell
367d0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20   inserted */..  
367e0 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51  assert( *pRC==SQ
367f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
36800 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
36810 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
36820 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
36830 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45  .  assert( MX_CE
36840 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
36850 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
36860 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
36870 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
36880 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  pBt) || CORRUPT_
36890 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
368a0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
368b0 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
368c0 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20  e->apOvfl) );.  
368d0 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
368e0 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
368f0 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ==ArraySize(pPag
36900 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20  e->aiOvfl) );.  
36910 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
36920 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
36930 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
36940 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73  .  /* The cell s
36950 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
36960 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c  e sized correctl
36970 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65  y.  However, whe
36980 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20  n moving a.  ** 
36990 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66  malformed cell f
369a0 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20  rom a leaf page 
369b0 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70  to an interior p
369c0 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  age, if the cell
369d0 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65   size.  ** wante
369e0 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
369f0 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e  n 4 but got roun
36a00 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74  ded up to 4 on t
36a10 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69  he leaf, then si
36a20 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ze.  ** might be
36a30 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65   less than 8 (le
36a40 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65  af-size + pointe
36a50 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69  r) on the interi
36a60 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a  or node.  Hence.
36a70 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66    ** the term af
36a80 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68  ter the || in th
36a90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
36aa0 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rt(). */.  asser
36ab0 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43  t( sz==pPage->xC
36ac0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70  ellSize(pPage, p
36ad0 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
36ae0 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
36af0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
36b00 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
36b10 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
36b20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
36b30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
36b40 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
36b50 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
36b60 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
36b70 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
36b80 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
36b90 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
36ba0 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
36bb0 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
36bc0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
36bd0 61 67 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a  against ArraySiz
36be0 65 2d 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c  e-1 since we hol
36bf0 64 20 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61  d back one extra
36c00 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20   slot.    ** as 
36c10 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20  a contingency.  
36c20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
36c30 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20  never need more 
36c40 74 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a  than 3 overflow.
36c50 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74      ** slots but
36c60 20 34 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64   4 are allocated
36c70 2c 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  , just to be saf
36c80 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
36c90 28 20 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ( j < ArraySize(
36ca0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31  pPage->apOvfl)-1
36cb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
36cc0 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
36cd0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
36ce0 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
36cf0 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75  ..    /* When mu
36d00 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
36d10 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72 65   occur, they are
36d20 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69   always sequenti
36d30 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a  al and in.    **
36d40 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20   sorted order.  
36d50 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20  This invariants 
36d60 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d 75  arise because mu
36d70 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
36d80 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
36d90 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65   occur when inse
36da0 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63 65  rting divider ce
36db0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
36dc0 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a  ent page during.
36dd0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67      ** balancing
36de0 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  , and the divide
36df0 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20  rs are adjacent 
36e00 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20  and sorted..    
36e10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  */.    assert( j
36e20 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69  ==0 || pPage->ai
36e30 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69  Ovfl[j-1]<(u16)i
36e40 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73   ); /* Overflows
36e50 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
36e60 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36e70 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65  j==0 || i==pPage
36e80 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20  ->aiOvfl[j-1]+1 
36e90 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  );   /* Overflow
36ea0 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c  s are sequential
36eb0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
36ec0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
36ed0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
36ee0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
36ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36f00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
36f10 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
36f20 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
36f30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
36f40 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36f50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
36f60 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
36f70 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61  ge->aData;.    a
36f80 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50 61  ssert( &data[pPa
36f90 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d  ge->cellOffset]=
36fa0 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  =pPage->aCellIdx
36fb0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   );.    rc = all
36fc0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
36fd0 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
36fe0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
36ff0 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
37000 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
37010 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
37020 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
37030 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70  e following prop
37040 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
37050 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
37060 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20  essfully */.    
37070 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30  assert( idx >= 0
37080 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37090 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65  idx >= pPage->ce
370a0 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
370b0 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52  ->nCell+2 || COR
370c0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
370d0 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
370e0 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
370f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
37100 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
37110 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
37120 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
37130 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
37140 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
37150 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
37160 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
37170 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
37180 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61  }.    pIns = pPa
37190 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69  ge->aCellIdx + i
371a0 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  *2;.    memmove(
371b0 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a  pIns+2, pIns, 2*
371c0 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
371d0 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  i));.    put2byt
371e0 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20  e(pIns, idx);.  
371f0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
37200 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65  ;.    /* increme
37210 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  nt the cell coun
37220 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b  t */.    if( (++
37230 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
37240 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64  ffset+4])==0 ) d
37250 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
37260 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61  fset+3]++;.    a
37270 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
37280 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
37290 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67  Offset+3])==pPag
372a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e  e->nCell );.#ifn
372b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
372c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
372d0 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
372e0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
372f0 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
37300 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
37310 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
37320 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
37330 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
37340 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
37350 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
37360 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
37370 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
37380 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
37390 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
373a0 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
373b0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
373c0 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20  .** A CellArray 
373d0 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
373e0 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74  a cache of point
373f0 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f  ers and sizes fo
37400 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69  r a.** consecuti
37410 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ve sequence of c
37420 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20  ells that might 
37430 62 65 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69  be held on multi
37440 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79  ple pages..*/.ty
37450 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65 6c  pedef struct Cel
37460 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79  lArray CellArray
37470 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72  ;.struct CellArr
37480 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  ay {.  int nCell
37490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
374a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
374b0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
374c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66  .  MemPage *pRef
374d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
374e0 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a  ference page */.
374f0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
37500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
37510 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
37520 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
37530 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
37540 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
37550 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
37560 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a   apCell[] */.};.
37570 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
37580 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20   the cell sizes 
37590 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e  at idx, idx+1, .
375a0 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65  .., idx+N-1 have
375b0 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65   been.** compute
375c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
375d0 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61  d populateCellCa
375e0 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  che(CellArray *p
375f0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e  , int idx, int N
37600 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ){.  assert( idx
37610 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d  >=0 && idx+N<=p-
37620 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c  >nCell );.  whil
37630 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73  e( N>0 ){.    as
37640 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b  sert( p->apCell[
37650 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69  idx]!=0 );.    i
37660 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78  f( p->szCell[idx
37670 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  ]==0 ){.      p-
37680 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70  >szCell[idx] = p
37690 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
376a0 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
376b0 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20  Cell[idx]);.    
376c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
376d0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
376e0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
376f0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
37700 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53  =p->pRef->xCellS
37710 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
37720 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a  apCell[idx]) );.
37730 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b      }.    idx++;
37740 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a  .    N--;.  }.}.
37750 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
37760 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74  e size of the Nt
37770 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
37780 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73   cell array.*/.s
37790 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
377a0 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74  NLINE u16 comput
377b0 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  eCellSize(CellAr
377c0 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
377d0 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
377e0 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
377f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43    assert( p->szC
37800 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70  ell[N]==0 );.  p
37810 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d  ->szCell[N] = p-
37820 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
37830 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
37840 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72  ell[N]);.  retur
37850 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a  n p->szCell[N];.
37860 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 61 63  }.static u16 cac
37870 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  hedCellSize(Cell
37880 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
37890 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
378a0 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
378b0 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c  ;.  if( p->szCel
378c0 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d  l[N] ) return p-
378d0 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65  >szCell[N];.  re
378e0 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c  turn computeCell
378f0 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f  Size(p, N);.}../
37900 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
37910 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  l[] contains poi
37920 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62  nters to nCell b
37930 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73  -tree page cells
37940 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c  . The .** szCell
37950 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
37960 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
37970 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c  tes of each cell
37980 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
37990 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  ** replaces the 
379a0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
379b0 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69 74   of page pPg wit
379c0 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
379d0 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72  f the cell.** ar
379e0 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20  ray..**.** Some 
379f0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  of the cells in 
37a00 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72  apCell[] may cur
37a10 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64  rently be stored
37a20 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a   in pPg. This.**
37a30 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
37a40 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
37a50 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20 62  caused by this b
37a60 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20  y making a copy 
37a70 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20  of any .** such 
37a80 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65  cells before ove
37a90 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67  rwriting the pag
37aa0 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  e data..**.** Th
37ab0 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20  e MemPage.nFree 
37ac0 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64  field is invalid
37ad0 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
37ae0 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65  ction. It is the
37af0 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
37b00 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
37b10 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72  r to set it corr
37b20 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
37b30 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65   int rebuildPage
37b40 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
37b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37b60 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
37b70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
37b80 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
37b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
37ba0 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  nal number of ce
37bb0 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  lls on page */. 
37bc0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
37bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37be0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
37bf0 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ls */.  u16 *szC
37c00 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ell             
37c10 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
37c20 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a   of cell sizes *
37c30 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  /.){.  const int
37c40 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
37c50 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
37c60 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
37c70 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20  der on pPg */.  
37c80 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
37c90 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20   = pPg->aData;  
37ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
37cb0 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
37cc0 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  pPg */.  const i
37cd0 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  nt usableSize = 
37ce0 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
37cf0 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Size;.  u8 * con
37d00 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61  st pEnd = &aData
37d10 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
37d20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65  int i;.  u8 *pCe
37d30 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65  llptr = pPg->aCe
37d40 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d  llIdx;.  u8 *pTm
37d50 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
37d60 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70  TempSpace(pPg->p
37d70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75  Bt->pPager);.  u
37d80 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d  8 *pData;..  i =
37d90 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
37da0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
37db0 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44  py(&pTmp[i], &aD
37dc0 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69  ata[i], usableSi
37dd0 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74  ze - i);..  pDat
37de0 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28  a = pEnd;.  for(
37df0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
37e00 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
37e10 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20  l = apCell[i];. 
37e20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49     if( SQLITE_WI
37e30 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61  THIN(pCell,aData
37e40 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20  ,pEnd) ){.      
37e50 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43  pCell = &pTmp[pC
37e60 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20  ell - aData];.  
37e70 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d    }.    pData -=
37e80 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
37e90 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
37ea0 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61 74  r, (pData - aDat
37eb0 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  a));.    pCellpt
37ec0 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20  r += 2;.    if( 
37ed0 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72  pData < pCellptr
37ee0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
37ef0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
37f00 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
37f10 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69   pCell, szCell[i
37f20 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
37f30 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e  szCell[i]==pPg->
37f40 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70  xCellSize(pPg, p
37f50 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54  Cell) || CORRUPT
37f60 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _DB );.    testc
37f70 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d  ase( szCell[i]!=
37f80 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  pPg->xCellSize(p
37f90 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d  Pg,pCell) );.  }
37fa0 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e  ..  /* The pPg->
37fb0 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e  nFree field is n
37fc0 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74  ow set incorrect
37fd0 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ly. The caller w
37fe0 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20  ill fix it. */. 
37ff0 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43   pPg->nCell = nC
38000 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65  ell;.  pPg->nOve
38010 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75  rflow = 0;..  pu
38020 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
38030 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32  r+1], 0);.  put2
38040 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
38050 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b  3], pPg->nCell);
38060 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
38070 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61  ta[hdr+5], pData
38080 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61   - aData);.  aDa
38090 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30  ta[hdr+7] = 0x00
380a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
380b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
380c0 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
380d0 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
380e0 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
380f0 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
38100 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ell.** contains 
38110 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
38120 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63  s of each such c
38130 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
38140 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a  on attempts to .
38150 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73  ** add the cells
38160 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
38170 72 72 61 79 20 74 6f 20 70 61 67 65 20 70 50 67  rray to page pPg
38180 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28  . If it cannot (
38190 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  because .** the 
381a0 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
381b0 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65   defragmented be
381c0 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77  fore the cells w
381d0 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65  ill fit), non-ze
381e0 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  ro.** is returne
381f0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
38200 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61   the cells are a
38210 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
38220 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65  y, zero is.** re
38230 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  turned..**.** Ar
38240 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20  gument pCellptr 
38250 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
38260 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
38270 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
38280 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20  ray.** (part of 
38290 70 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70  page pPg) to pop
382a0 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c  ulate. After cel
382b0 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77  l apCell[0] is w
382c0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
382d0 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36   page body, a 16
382e0 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73 20 77  -bit offset is w
382f0 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70  ritten to pCellp
38300 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66  tr. And so on, f
38310 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20  or each.** cell 
38320 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49 74  in the array. It
38330 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
38340 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
38350 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a  ller to ensure.*
38360 2a 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  * that it is saf
38370 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74  e to overwrite t
38380 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
38390 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
383a0 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ay..**.** When t
383b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
383c0 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20  called, *ppData 
383d0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74  points to the st
383e0 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  art of the .** c
383f0 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70  ontent area on p
38400 61 67 65 20 70 50 67 2e 20 49 66 20 74 68 65 20  age pPg. If the 
38410 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74  size of the cont
38420 65 6e 74 20 61 72 65 61 20 69 73 20 65 78 74 65  ent area is exte
38430 6e 64 65 64 2c 0a 2a 2a