/ Hex Artifact Content
Login

Artifact 7b21976dc09778f05af0e085c40b735467ffdcea64bd07dace3f12ca0a2defce:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5a40: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5a50: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5a60: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
5a70: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
5a80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
5a90: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5aa0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5ac0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5ad0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5ae0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5b10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5b40: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5b50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5b70: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
5b80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5b90: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5ba0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5bd0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5be0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5bf0: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5c00: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5c10: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5c20: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5c30: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5c40: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5c50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
5c60: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5c70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5c80: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5c90: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5ca0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5cb0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5cc0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5cd0: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5cf0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5d00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5d10: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5d20: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5d30: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5d40: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5d50: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
5d60: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5d70: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d80: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5d90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5da0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5db0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5dd0: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5de0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5df0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5e00: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5e10: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e30: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5e40: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5e50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5e60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5e70: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5e80: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5e90: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ea0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5eb0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5ee0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5ef0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5f00: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5f10: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5f20: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5f40: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5f50: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5f60: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5f70: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5f80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5f90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5fa0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5fb0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5fc0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5fd0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5fe0: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5ff0: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
6000: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
6010: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
6020: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
6030: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
6040: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
6050: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
6060: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
6070: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
6080: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
60a0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
60b0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
60c0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
60d0: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
60e0: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
60f0: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
6100: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
6110: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
6120: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
6130: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
6140: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
6150: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
6160: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
6170: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
6180: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
6190: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
61a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
61b0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
61c0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
61d0: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
61e0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
61f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
6200: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
6210: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
6220: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
6230: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
6240: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
6250: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6260: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
6270: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
6280: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
6290: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
62a0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
62b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
62c0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
62d0: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
62e0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
62f0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
6300: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
6310: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
6320: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6330: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
6340: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
6350: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
6360: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
6370: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
6380: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6390: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
63a0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
63b0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
63c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
63d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
63e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
63f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6400: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6410: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6420: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6430: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6440: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6450: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6460: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6470: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6480: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
6490: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
64a0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
64b0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
64c0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
64d0: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
64e0: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
64f0: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6520: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6530: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6540: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6550: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
6560: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
6570: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
6580: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
6590: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
65a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
65b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
65c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
65d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
65e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
65f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6600: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6610: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6620: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6630: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6650: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6660: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6670: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6690: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
66a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
66b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
66d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
66e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
66f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6700: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6710: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6720: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6730: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6740: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6750: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6760: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6770: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6780: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6790: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
67a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
67b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
67c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
67d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
67e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
67f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6810: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6840: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
6850: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
6860: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6870: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
6880: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
6890: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
68a0: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
68d0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
68e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
68f0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
6900: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
6910: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
6920: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6930: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
6940: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6950: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
6960: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
6970: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6980: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
6990: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
69a0: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
69b0: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
69c0: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
69d0: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
69e0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
69f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
6a00: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
6a10: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
6a20: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
6a30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
6a40: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
6a70: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
6a80: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
6a90: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
6aa0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
6ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
6ac0: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
6ad0: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
6ae0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
6af0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
6b00: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
6b10: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
6b20: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
6b30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
6b40: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
6b50: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
6b60: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6b90: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
6ba0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6bd0: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
6be0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
6bf0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
6c00: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
6c10: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
6c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6c30: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6c40: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6c60: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6c70: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
6c80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6c90: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6ca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cc0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6cd0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6ce0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6cf0: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6d00: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6d20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6d30: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
6d40: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
6d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6d60: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6d70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6d80: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6d90: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6da0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6db0: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6dc0: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6dd0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6de0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6df0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6e00: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6e20: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6e30: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6e40: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6e50: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6e60: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6e70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6e80: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6e90: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6ea0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6eb0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6ec0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6ed0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6ee0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6ef0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6f00: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6f10: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6f20: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6f30: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6f60: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6f70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6f90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6fa0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6fb0: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6fc0: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6fd0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6fe0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6ff0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
7000: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
7010: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
7020: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
7030: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
7040: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
7050: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
7060: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
7070: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
7080: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
7090: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
70a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
70b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
70c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
70d0: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
70e0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
70f0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
7100: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7110: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
7120: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
7130: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
7140: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
7150: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
7160: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
7170: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7180: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
71a0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
71c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
71d0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
71e0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
71f0: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
7200: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7210: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
7220: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
7230: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
7240: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7250: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
7260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
7270: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
7280: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
7290: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
72a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
72b0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
72c0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
72d0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
72e0: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
72f0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
7300: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
7310: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
7320: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
7330: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
7340: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
7350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
7360: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
7370: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
7380: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
7390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
73a0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
73b0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
73c0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
73d0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
73e0: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
73f0: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7400: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7410: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7420: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7430: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
7440: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
7450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7460: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7470: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
7480: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
7490: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
74a0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
74b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
74c0: 72 20 74 6f 20 61 20 66 61 6b 65 20 42 74 43 75  r to a fake BtCu
74d0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 68 61 74  rsor object that
74e0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73   will always ans
74f0: 77 65 72 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20  wer.** false to 
7500: 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
7510: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
7520: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 20   routine above. 
7530: 20 54 68 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72   The fake.** cur
7540: 73 6f 72 20 72 65 74 75 72 6e 65 64 20 6d 75 73  sor returned mus
7550: 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  t not be used wi
7560: 74 68 20 61 6e 79 20 6f 74 68 65 72 20 42 74 72  th any other Btr
7570: 65 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ee interface..*/
7580: 0a 42 74 43 75 72 73 6f 72 20 2a 73 71 6c 69 74  .BtCursor *sqlit
7590: 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c 69 64  e3BtreeFakeValid
75a0: 43 75 72 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20  Cursor(void){.  
75b0: 73 74 61 74 69 63 20 75 38 20 66 61 6b 65 43 75  static u8 fakeCu
75c0: 72 73 6f 72 20 3d 20 43 55 52 53 4f 52 5f 56 41  rsor = CURSOR_VA
75d0: 4c 49 44 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  LID;.  assert( o
75e0: 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
75f0: 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a  , eState)==0 );.
7600: 20 20 72 65 74 75 72 6e 20 28 42 74 43 75 72 73    return (BtCurs
7610: 6f 72 2a 29 26 66 61 6b 65 43 75 72 73 6f 72 3b  or*)&fakeCursor;
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7630: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
7640: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
7650: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
7660: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7670: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7680: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7690: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
76a0: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
76b0: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
76c0: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
76d0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
76e0: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
76f0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7700: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
7710: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
7720: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
7730: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
7740: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
7750: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
7760: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7770: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7780: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7790: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
77a0: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
77b0: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
77c0: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
77d0: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
77e0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
77f0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7800: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
7810: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
7820: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
7830: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
7840: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
7850: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
7860: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7870: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7880: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7890: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
78a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78b0: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
78c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
78d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
78e0: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
78f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7900: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
7910: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
7920: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7940: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
7950: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
7960: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7970: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7990: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
79a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
79b0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
79c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
79d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
79e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
79f0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7a00: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
7a10: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
7a20: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
7a30: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
7a40: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
7a50: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
7a60: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7a70: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7a80: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7a90: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
7aa0: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
7ab0: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
7ac0: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
7ad0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
7ae0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7af0: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7b00: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
7b10: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
7b20: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
7b30: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
7b40: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
7b50: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
7b60: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7b70: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7b80: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7b90: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
7ba0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7bb0: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
7bc0: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
7bd0: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
7be0: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
7bf0: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7c00: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
7c10: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
7c20: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
7c30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7c40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
7c50: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
7c60: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7c70: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7c80: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7c90: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7ca0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
7cb0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
7cc0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
7cd0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
7ce0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
7cf0: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7d00: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
7d10: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
7d20: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
7d30: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
7d40: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
7d50: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7d60: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7d70: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7d80: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7d90: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7da0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7db0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7dc0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7dd0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7de0: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7df0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7e00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7e10: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7e20: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
7e30: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
7e40: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
7e50: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7e60: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7e70: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7e80: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7e90: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7ea0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7eb0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7ec0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7ed0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7ee0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7ef0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7f00: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7f10: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7f20: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7f30: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7f40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7f50: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7f60: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7f70: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7f80: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7f90: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7fa0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7fb0: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7fc0: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7fd0: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7fe0: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7ff0: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
8000: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
8010: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
8020: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
8030: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
8040: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
8050: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8060: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
8070: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
8080: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
8090: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
80a0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
80b0: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
80c0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
80d0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
80e0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
80f0: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
8100: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
8110: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8120: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
8130: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8140: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
8150: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
8160: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
8170: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
8180: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
8190: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
81a0: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
81b0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
81c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81d0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
81e0: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
81f0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
8200: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
8210: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
8220: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8230: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
8240: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
8250: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
8260: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
8270: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
8280: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
8290: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
82a0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
82b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
82c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
82d0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
82e0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
82f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8300: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
8310: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
8320: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
8330: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8340: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
8350: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
8360: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
8370: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
8380: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
8390: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
83a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
83b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
83c0: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
83d0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
83e0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
83f0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8400: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
8410: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8420: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8430: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
8440: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
8450: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
8460: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8470: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
8480: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
8490: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
84a0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
84b0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
84c0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
84d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
84e0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
84f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8500: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
8510: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
8520: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
8530: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8540: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
8550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
8560: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
8570: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8580: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
8590: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
85a0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
85b0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
85c0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
85d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
85e0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
85f0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
8600: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
8610: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8620: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
8630: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
8640: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
8650: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8660: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8670: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8680: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
86a0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
86b0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
86c0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
86d0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
86e0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
86f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8700: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
8710: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
8720: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8730: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
8740: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
8750: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8760: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8770: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8780: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8790: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
87a0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
87b0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
87c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
87d0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
87e0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
87f0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8800: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8810: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
8820: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
8830: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
8840: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
8850: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8860: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8870: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8880: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8890: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
88a0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
88b0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
88c0: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
88d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
88e0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
88f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8900: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8910: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8920: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
8930: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
8940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
8950: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
8960: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8970: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8980: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8990: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
89a0: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
89b0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
89c0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
89d0: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
89e0: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
89f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8a00: 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20  PGNO(iPtrmap);. 
8a10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8a20: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
8a30: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
8a40: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8a50: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
8a60: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
8a70: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
8a80: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
8a90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
8aa0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
8ab0: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
8ac0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8ad0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8ae0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8af0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8b00: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8b10: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8b20: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8b30: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8b40: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8b50: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8b60: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8b70: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8b80: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8b90: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8ba0: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8bb0: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8bc0: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8bd0: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8be0: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8c00: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8c10: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8c20: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8c30: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8c40: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8c50: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8c60: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8c70: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8c80: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8c90: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8ca0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
8cb0: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
8cc0: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
8cd0: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
8ce0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8cf0: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
8d00: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
8d10: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
8d20: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
8d30: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
8d40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8d50: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
8d60: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
8d70: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
8d80: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
8d90: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
8da0: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
8db0: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
8dc0: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
8dd0: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
8de0: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
8df0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
8e00: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
8e10: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8e20: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
8e30: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
8e40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
8e50: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8e60: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8e70: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8ea0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8eb0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8ec0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8ed0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8ee0: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
8ef0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
8f00: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
8f10: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
8f20: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
8f30: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
8f40: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
8f50: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
8f60: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
8f70: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
8f80: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8f90: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
8fa0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
8fb0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
8fc0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
8fd0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
8fe0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
8ff0: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9000: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9010: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9020: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9030: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
9040: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
9050: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
9060: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
9070: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
9080: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9090: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
90a0: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
90b0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
90c0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
90d0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
90e0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
90f0: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9100: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9110: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9120: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9130: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
9140: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
9150: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
9160: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
9170: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9180: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
9190: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
91a0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
91b0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
91c0: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
91d0: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
91e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
91f0: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9200: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9210: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9220: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9230: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
9240: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
9250: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9260: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9270: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
9280: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
9290: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
92a0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
92b0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
92c0: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
92d0: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
92e0: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
92f0: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9300: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9310: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9320: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9330: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
9340: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
9350: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
9360: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
9370: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
9380: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
9390: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
93a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
93b0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
93c0: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
93d0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
93e0: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
93f0: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9400: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9410: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9420: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9430: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
9440: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
9450: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
9460: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
9470: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
9480: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
9490: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
94a0: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
94b0: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
94c0: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
94d0: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
94e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
94f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9500: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9510: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9520: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9530: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9540: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9560: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9570: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9580: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9590: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
95a0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
95b0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
95c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
95d0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
95e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
95f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9600: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9610: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9620: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9630: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9640: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9650: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
9660: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
9670: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
9680: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
9690: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
96a0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
96b0: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
96d0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
96e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
96f0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9700: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9710: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9730: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9740: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9750: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9760: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9770: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9780: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9790: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
97a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
97b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
97c0: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
97d0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
97e0: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
97f0: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9800: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9810: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9820: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9830: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9840: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9850: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9860: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9870: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9880: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9890: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
98a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
98b0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
98c0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
98d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
98e0: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
98f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9900: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9910: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9920: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9930: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9940: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9950: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9960: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9970: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9980: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9990: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
99a0: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
99b0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
99c0: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
99d0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
99e0: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
99f0: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9a00: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9a10: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9a20: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9a30: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9a40: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9a50: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9a60: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9a70: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9a80: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9a90: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9aa0: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9ab0: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9ac0: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9ad0: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9ae0: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9af0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9b00: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9b10: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9b20: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9b30: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9b40: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9b50: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9b60: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9b70: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9b80: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9b90: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9ba0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9bb0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9bc0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9bd0: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9be0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9bf0: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9c10: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9c20: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9c50: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9c60: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9c70: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9c80: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9c90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9ca0: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9cb0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9cc0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9cd0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9ce0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9cf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9d00: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9d10: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9d20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9d30: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
9d40: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
9d50: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
9d60: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
9d70: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9d80: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
9d90: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9da0: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9db0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9dc0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9dd0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9de0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9df0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9e00: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9e10: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9e20: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
9e30: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
9e40: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
9e50: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
9e60: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
9e70: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
9e80: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
9e90: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
9ea0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9eb0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9ec0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9ed0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9ef0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9f00: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9f10: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9f20: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9f30: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9f40: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f60: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9f70: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9f80: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9fa0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
9fb0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
9fc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9fd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9fe0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9ff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a000: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a010: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a020: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a030: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a040: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a050: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a060: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a070: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a080: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a090: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a0a0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a0b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a0c0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a0d0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a0e0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a0f0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a100: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a110: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a120: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a130: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a140: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a150: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a160: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a170: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a180: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a190: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a1a0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a1b0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a1c0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a1d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a1e0: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a1f0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a200: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a210: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a220: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a230: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a240: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a250: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a260: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a270: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a280: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a290: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a2a0: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a2b0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a2c0: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a2d0: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a2e0: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a2f0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a300: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a310: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a320: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a330: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a340: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a350: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a360: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a370: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a380: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a390: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a3a0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a3b0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a3c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a3d0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a3e0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a3f0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a400: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a410: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a420: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a430: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a440: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a450: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a470: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a480: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a490: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a4a0: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a4b0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a4c0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a4d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a4e0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a4f0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a500: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a510: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a520: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a530: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a540: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a550: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a560: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a570: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a580: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a590: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a5a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a5b0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a5c0: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a5d0: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a5e0: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a5f0: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a600: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a610: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a620: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a630: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a640: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a650: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a660: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a670: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a680: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a690: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
a6a0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
a6b0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6e0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a6f0: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
a700: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
a730: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
a740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a750: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
a760: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a770: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
a780: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
a790: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
a7a0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
a7b0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
a7c0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
a7d0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
a7e0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
a7f0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
a800: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
a810: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
a820: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
a830: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
a840: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
a850: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
a860: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
a870: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
a880: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a890: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
a8a0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
a8b0: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
a8c0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
a8d0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
a8e0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a8f0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
a900: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a910: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
a920: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
a930: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
a940: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
a950: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a960: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
a970: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
a980: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
a990: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
a9a0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
a9b0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
a9c0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
a9d0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
a9e0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
a9f0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
aa00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
aa10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
aa20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
aa30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
aa40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
aa50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
aa60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
aa70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
aa80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
aa90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
aaa0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
aab0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
aac0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
aad0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
aae0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
aaf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ab00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ab10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ab20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ab30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
ab40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
ab50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
ab60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
ab70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
ab80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
ab90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
aba0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
abb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
abc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
abd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
abe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
abf0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
ac00: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
ac10: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
ac20: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
ac30: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
ac40: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
ac50: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
ac60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
ac70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
ac80: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
ac90: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
aca0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
acb0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
acc0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
acd0: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
ace0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
acf0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
ad00: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
ad10: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
ad20: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
ad30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
ad40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ad50: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
ad60: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
ad70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ad80: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
ad90: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
ada0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
adb0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
adc0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
add0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
ade0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
adf0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
ae00: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
ae10: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
ae20: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
ae30: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
ae40: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
ae50: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
ae60: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
ae70: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
ae80: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
ae90: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
aea0: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
aeb0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
aec0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
aed0: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
aee0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
aef0: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
af00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
af10: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
af20: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
af30: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
af40: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
af50: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
af60: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
af70: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
af80: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
af90: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
afa0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
afb0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
afc0: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
afd0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
afe0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
aff0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b000: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b010: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b020: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b030: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b040: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b050: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b060: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b070: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b080: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b090: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b0a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b0b0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b0c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
b0d0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
b0e0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
b0f0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
b100: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
b110: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
b120: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
b130: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
b140: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
b150: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
b160: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
b170: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
b180: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
b190: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
b1a0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
b1b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
b1c0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
b1d0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
b1e0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
b1f0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
b200: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c  );.  if( info.nL
b210: 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
b220: 61 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ad ){.    Pgno o
b230: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
b240: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell[info.nSize
b250: 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  -4]);.    ptrmap
b260: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
b270: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
b280: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
b290: 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d  gno, pRC);.  }.}
b2a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
b2b0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
b2c0: 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20  age given. This 
b2d0: 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69  routine reorgani
b2e0: 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  zes cells within
b2f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20   the.** page so 
b300: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
b310: 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e  o free-blocks on
b320: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
b330: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  list..**.** Para
b340: 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69  meter nMaxFrag i
b350: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
b360: 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74  ount of fragment
b370: 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d 61  ed space that ma
b380: 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20  y be.** present 
b390: 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74 65  in the page afte
b3a0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
b3b0: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56  eturns..**.** EV
b3c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
b3d0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
b3e0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
b3f0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
b400: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
b410: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
b420: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
b430: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
b440: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
b450: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
b460: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
b470: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
b480: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
b490: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
b4a0: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
b4b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
b4c0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
b4d0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
b4e0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b4f0: 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a   int nMaxFrag){.
b500: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b520: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b530: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b550: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
b560: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
b570: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
b580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
b590: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
b5a0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
b5b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b5c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b5d0: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
b5e0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b5f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b600: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
b610: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
b620: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
b630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b640: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
b650: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
b660: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
b690: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b6a0: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
b6b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b6c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b6d0: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
b6e0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
b6f0: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
b700: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
b710: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
b720: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
b730: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
b740: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
b750: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b760: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
b770: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
b780: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
b790: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
b7a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
b7b0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
b7c0: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
b7d0: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
b7e0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
b7f0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
b800: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
b810: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b820: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b830: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b840: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b850: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b860: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b870: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
b880: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
b890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b8a0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
b8b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b8c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b8d0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b8e0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
b8f0: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
b900: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
b910: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b920: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
b930: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
b940: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
b950: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
b960: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
b970: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
b980: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43  [hdr+3]) );.  iC
b990: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
b9a0: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b  ffset + 2*nCell;
b9b0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
b9c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b9d0: 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68  leSize;..  /* Th
b9e0: 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
b9f0: 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20   pages with two 
ba00: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c  or fewer free bl
ba10: 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61  ocks and nMaxFra
ba20: 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20  g.  ** or fewer 
ba30: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
ba40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
ba50: 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d  t is faster to m
ba60: 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  ove the.  ** two
ba70: 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73   (or one) blocks
ba80: 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20   of cells using 
ba90: 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64  memmove() and ad
baa0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20  d the required. 
bab0: 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65   ** offsets to e
bac0: 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ach pointer in t
bad0: 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
bae0: 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73  array than it is
baf0: 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73   to .  ** recons
bb00: 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65  truct the entire
bb10: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28   page.  */.  if(
bb20: 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37   (int)data[hdr+7
bb30: 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20  ]<=nMaxFrag ){. 
bb40: 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67     int iFree = g
bb50: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
bb60: 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  r+1]);.    if( i
bb70: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Free ){.      in
bb80: 74 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62  t iFree2 = get2b
bb90: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d  yte(&data[iFree]
bba0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67  );..      /* pag
bbb0: 65 46 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20  eFindSlot() has 
bbc0: 61 6c 72 65 61 64 79 20 76 65 72 69 66 69 65 64  already verified
bbd0: 20 74 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b   that free block
bbe0: 73 20 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20  s are sorted.   
bbf0: 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f     ** in order o
bc00: 66 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  f offset within 
bc10: 74 68 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68  the page, and th
bc20: 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65  at no block exte
bc30: 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73  nds.      ** pas
bc40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
bc50: 20 70 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20   page. Provided 
bc60: 74 68 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f  the two free slo
bc70: 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20  ts do not .     
bc80: 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69   ** overlap, thi
bc90: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
bca0: 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20  t the memmove() 
bcb0: 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c  calls below will
bcc0: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76   not.      ** ov
bcd0: 65 72 77 72 69 74 65 20 74 68 65 20 75 73 61 62  erwrite the usab
bce0: 6c 65 53 69 7a 65 20 62 79 74 65 20 62 75 66 66  leSize byte buff
bcf0: 65 72 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  er, even if the 
bd00: 64 61 74 61 62 61 73 65 20 70 61 67 65 0a 20 20  database page.  
bd10: 20 20 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70      ** is corrup
bd20: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  t.  */.      ass
bd30: 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c  ert( iFree2==0 |
bd40: 7c 20 69 46 72 65 65 32 3e 69 46 72 65 65 20 29  | iFree2>iFree )
bd50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bd60: 69 46 72 65 65 2b 67 65 74 32 62 79 74 65 28 26  iFree+get2byte(&
bd70: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c  data[iFree+2]) <
bd80: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
bd90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
bda0: 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65  ree2==0 || iFree
bdb0: 32 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2+get2byte(&data
bdc0: 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75  [iFree2+2]) <= u
bdd0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20  sableSize );..  
bde0: 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65      if( 0==iFree
bdf0: 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65  2 || (data[iFree
be00: 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46  2]==0 && data[iF
be10: 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20  ree2+1]==0) ){. 
be20: 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20         u8 *pEnd 
be30: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
be40: 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
be50: 20 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72         u8 *pAddr
be60: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
be70: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
be80: 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
be90: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29  (&data[iFree+2])
bea0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  ;.        int to
beb0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
bec0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
bed0: 20 20 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72      if( top>=iFr
bee0: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
bef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bf00: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
bf10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
bf20: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20       if( iFree2 
bf30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
bf40: 65 72 74 28 20 69 46 72 65 65 2b 73 7a 3c 3d 69  ert( iFree+sz<=i
bf50: 46 72 65 65 32 20 29 3b 20 2f 2a 20 56 65 72 69  Free2 ); /* Veri
bf60: 66 69 65 64 20 62 79 20 70 61 67 65 46 69 6e 64  fied by pageFind
bf70: 53 6c 6f 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  Slot() */.      
bf80: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
bf90: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
bfa0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  2]);.          a
bfb0: 73 73 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b  ssert( iFree+sz+
bfc0: 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65  sz2+iFree2-(iFre
bfd0: 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+sz) <= usableS
bfe0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
bff0: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
c000: 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64  Free+sz+sz2], &d
c010: 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69  ata[iFree+sz], i
c020: 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29  Free2-(iFree+sz)
c030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
c040: 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20  += sz2;.        
c050: 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d  }.        cbrk =
c060: 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20   top+sz;.       
c070: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69   assert( cbrk+(i
c080: 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61  Free-top) <= usa
c090: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
c0a0: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
c0b0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f  [cbrk], &data[to
c0c0: 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a  p], iFree-top);.
c0d0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64          for(pAdd
c0e0: 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  r=&data[cellOffs
c0f0: 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b  et]; pAddr<pEnd;
c100: 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20   pAddr+=2){.    
c110: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
c120: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
c130: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72        if( pc<iFr
c140: 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  ee ){ put2byte(p
c150: 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a  Addr, pc+sz); }.
c160: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
c170: 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20  f( pc<iFree2 ){ 
c180: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
c190: 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20  pc+sz2); }.     
c1a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
c1b0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  o defragment_out
c1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c1d0: 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73    }..  cbrk = us
c1e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
c1f0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c200: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
c210: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
c220: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
c230: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
c240: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
c250: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
c260: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
c270: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
c280: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
c290: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c2a0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
c2b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c2c0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
c2d0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
c2e0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
c2f0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
c300: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
c310: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
c320: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
c330: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
c340: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
c350: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c360: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c380: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c390: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
c3a0: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
c3b0: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
c3c0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
c3d0: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
c3e0: 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b  ize(pPage, &src[
c3f0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
c400: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
c410: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
c420: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c430: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c450: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
c470: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
c480: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
c490: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
c4a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
c4b0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
c4c0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
c4d0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c4f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c500: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
c510: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
c520: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
c530: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
c540: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
c550: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
c560: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
c570: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
c580: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
c590: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
c5a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
c5b0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
c5c0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
c5d0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
c5e0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
c5f0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
c600: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
c610: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
c620: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
c630: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
c640: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
c650: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
c660: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
c670: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c680: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c690: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
c6a0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
c6b0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
c6c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c6d0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
c6e0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
c6f0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
c700: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
c710: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
c720: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
c730: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c740: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c750: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c760: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
c770: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c780: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
c790: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
c7a0: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
c7b0: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
c7c0: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
c7d0: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
c7e0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
c7f0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
c800: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
c810: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
c820: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
c830: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
c840: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
c850: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
c860: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
c870: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
c880: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
c890: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
c8a0: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
c8b0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
c8c0: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
c8d0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
c8e0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
c8f0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
c900: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
c910: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
c920: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
c930: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
c940: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
c950: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
c960: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
c970: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
c980: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
c990: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
c9a0: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
c9b0: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
c9c0: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
c9d0: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
c9e0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
c9f0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
ca00: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
ca10: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
ca20: 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20  rOffset;.  u8 * 
ca30: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
ca40: 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  g->aData;.  int 
ca50: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
ca60: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
ca70: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
ca80: 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  r]);.  int x;.  
ca90: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
caa0: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
cab0: 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 73 69 7a  eSize;.  int siz
cac0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
cad0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
cae0: 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73  e slot */..  ass
caf0: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 77  ert( pc>0 );.  w
cb00: 68 69 6c 65 28 20 70 63 3c 3d 75 73 61 62 6c 65  hile( pc<=usable
cb10: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a  Size-4 ){.    /*
cb20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cb30: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
cb40: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
cb50: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
cb60: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
cb70: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
cb80: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
cb90: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
cba0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
cbb0: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
cbc0: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
cbd0: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
cbe0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
cbf0: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
cc00: 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69  .    if( (x = si
cc10: 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29  ze - nByte)>=0 )
cc20: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
cc30: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
cc40: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
cc50: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
cc60: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
cc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
cc80: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
cc90: 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20  T_PAGE(pPg);.   
cca0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ccb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
ccc0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <4 ){.        /*
ccd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cce0: 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61  11498-58022 In a
ccf0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
cd00: 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f  ree page, the to
cd10: 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  tal.        ** n
cd20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
cd30: 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20  n fragments may 
cd40: 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a  not exceed 60. *
cd50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  /.        if( aD
cd60: 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20  ata[hdr+7]>57 ) 
cd70: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20  return 0;..     
cd80: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
cd90: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
cda0: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
cdb0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
cdc0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
cdd0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
cde0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
cdf0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
ce00: 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44  Data[iAddr], &aD
ce10: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
ce20: 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37       aData[hdr+7
ce30: 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20  ] += (u8)x;.    
ce40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ce50: 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d   /* The slot rem
ce60: 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ains on the free
ce70: 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74  -list. Reduce it
ce80: 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e  s size to accoun
ce90: 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  t.         ** fo
cea0: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
ceb0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
cec0: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
ced0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61       put2byte(&a
cee0: 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  Data[pc+2], x);.
cef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
cf00: 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b  turn &aData[pc +
cf10: 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   x];.    }.    i
cf20: 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70  Addr = pc;.    p
cf30: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
cf40: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66  ata[pc]);.    if
cf50: 28 20 70 63 3c 69 41 64 64 72 2b 73 69 7a 65 20  ( pc<iAddr+size 
cf60: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
cf70: 66 28 20 70 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( pc ){.    *pR
cf80: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
cf90: 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20  PT_PAGE(pPg);.  
cfa0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
cfb0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
cfc0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
cfd0: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
cfe0: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
cff0: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
d000: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d010: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
d020: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
d030: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
d040: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
d050: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
d060: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
d070: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
d080: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
d090: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
d0a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
d0b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
d0c0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
d0d0: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
d0e0: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
d0f0: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
d100: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
d110: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
d120: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
d130: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
d140: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
d150: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
d160: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
d170: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
d180: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
d190: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
d1a0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d1b0: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
d1c0: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
d1d0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
d1e0: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
d1f0: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
d200: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
d210: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
d220: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
d230: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
d240: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
d250: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
d260: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
d270: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
d280: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
d290: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d2a0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
d2b0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
d2c0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
d2d0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
d2e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
d2f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d300: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
d310: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d340: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
d350: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d360: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d370: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
d390: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
d3a0: 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20  */.  int gap;   
d3b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d3c0: 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65  te of gap betwee
d3d0: 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  n cell pointers 
d3e0: 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  and cell content
d3f0: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
d400: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
d410: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
d420: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d430: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
d440: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d450: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d460: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d470: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d480: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
d490: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
d4a0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
d4b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
d4c0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
d4d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
d4e0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
d4f0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28  ssert( nByte < (
d500: 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d  int)(pPage->pBt-
d510: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29  >usableSize-8) )
d520: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
d530: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
d540: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
d550: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
d560: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
d570: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
d580: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
d590: 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29  rt( gap<=65536 )
d5a0: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
d5b0: 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39  OF: R-29356-0239
d5c0: 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  1 If the databas
d5d0: 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62  e uses a 65536-b
d5e0: 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20  yte page size.  
d5f0: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72  ** and the reser
d600: 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72  ved space is zer
d610: 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c  o (the usual val
d620: 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20  ue for reserved 
d630: 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e  space).  ** then
d640: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d650: 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65  t offset of an e
d660: 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20  mpty page wants 
d670: 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a  to be 65536..  *
d680: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
d690: 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c  integer is too l
d6a0: 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65  arge to be store
d6b0: 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e  d in a 2-byte un
d6c0: 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65  signed.  ** inte
d6d0: 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20  ger, so a value 
d6e0: 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20  of 0 is used in 
d6f0: 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20  its place. */.  
d700: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
d710: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
d720: 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e  assert( top<=(in
d730: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
d740: 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50  ableSize ); /* P
d750: 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64  revent by getAnd
d760: 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20  InitPage() */.  
d770: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
d780: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26     if( top==0 &&
d790: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d7a0: 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29  bleSize==65536 )
d7b0: 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35  {.      top = 65
d7c0: 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  536;.    }else{.
d7d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d7e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
d7f0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
d800: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
d810: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
d820: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
d830: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
d840: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
d850: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
d860: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
d870: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
d880: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
d890: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
d8a0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
d8b0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
d8c0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
d8d0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
d8e0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
d8f0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
d900: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d910: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
d920: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
d930: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
d940: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
d950: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
d960: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
d970: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
d980: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
d990: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
d9a0: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
d9b0: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
d9c0: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
d9d0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
d9e0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
d9f0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
da00: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
da10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
da20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
da30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
da40: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
da50: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
da60: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
da70: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
da80: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
da90: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
daa0: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
dab0: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
dac0: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
dad0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
dae0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
daf0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
db00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
db10: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
db20: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
db30: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
db40: 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28  Page(pPage, MIN(
db50: 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  4, pPage->nFree 
db60: 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20  - (2+nByte)));. 
db70: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
db80: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
db90: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
dba0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
dbb0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
dbc0: 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  2+nByte<=top );.
dbd0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
dbe0: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
dbf0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
dc00: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
dc10: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
dc20: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
dc30: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
dc40: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
dc50: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
dc60: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
dc70: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
dc80: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
dc90: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
dca0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
dcb0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
dcc0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
dcd0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
dce0: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
dcf0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
dd00: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
dd10: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
dd20: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
dd30: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
dd40: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
dd50: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
dd60: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
dd70: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dd80: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
dd90: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
dda0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ddb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ddc0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
ddd0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
dde0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
ddf0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
de00: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
de10: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
de20: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
de30: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
de40: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
de50: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
de60: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
de70: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
de80: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  esced..**.** Not
de90: 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
dea0: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
deb0: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
dec0: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
ded0: 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ge(),.** that ro
dee0: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
def0: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
df00: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
df10: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
df20: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
df30: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
df40: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
df50: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
df60: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
df70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
df80: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
df90: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
dfa0: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
dfb0: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
dfc0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
dfd0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
dfe0: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
dff0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
e000: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
e010: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
e020: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
e030: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
e040: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e060: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
e070: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
e080: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
e090: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0b0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
e0c0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
e0d0: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
e100: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
e110: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
e120: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
e150: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
e160: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
e170: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e190: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
e1a0: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36  f iSize */.  u16
e1b0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
e1e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e1f0: 61 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  a */.  u32 iEnd 
e200: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
e210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e220: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
e230: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
e240: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
e250: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
e260: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
e270: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
e280: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e290: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
e2a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e2b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
e2c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e2d0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e2e0: 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e  PT_DB || iStart>
e2f0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
e300: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
e310: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
e320: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
e330: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
e340: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e350: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
e360: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e370: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e380: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e390: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
e3a0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
e3b0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
e3c0: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
e3d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e3e0: 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a  eSize-4 );..  /*
e3f0: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
e400: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
e410: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
e420: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
e430: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
e440: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
e450: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
e460: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
e470: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
e480: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
e490: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
e4a0: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
e4b0: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
e4c0: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
e4d0: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
e4e0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
e4f0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
e500: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
e510: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
e520: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
e530: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
e540: 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  )<iStart ){.    
e550: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
e560: 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  Ptr+4 ){.       
e570: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30   if( iFreeBlk==0
e580: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5a0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
e5b0: 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
e5c0: 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42     iPtr = iFreeB
e5d0: 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  lk;.    }.    if
e5e0: 28 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65  ( iFreeBlk>pPage
e5f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e600: 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  e-4 ){.      ret
e610: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e620: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e630: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
e640: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
e650: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
e660: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
e670: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
e680: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
e690: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
e6a0: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
e6b0: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
e6c0: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
e6d0: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
e6e0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
e6f0: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
e700: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
e710: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
e720: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
e730: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
e740: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
e750: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
e760: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
e770: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
e780: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
e790: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
e7a0: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
e7b0: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
e7c0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e7d0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45  pPage);.      iE
e7e0: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
e7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e800: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
e810: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
e820: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e830: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
e840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e850: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
e860: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e870: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
e880: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
e890: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
e8a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
e8b0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
e8c0: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
e8d0: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
e8e0: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
e8f0: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
e900: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
e910: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
e920: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
e930: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
e940: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
e950: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
e960: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e970: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
e980: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
e990: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
e9a0: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
e9b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
e9c0: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
e9d0: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
e9e0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
e9f0: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
ea00: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
ea10: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
ea20: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Page);.        n
ea30: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
ea40: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
ea50: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
ea60: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
ea70: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
ea80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ea90: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
eaa0: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
eab0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
eac0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64  GE(pPage);.    d
ead0: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
eae0: 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67  rag;.  }.  x = g
eaf0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
eb00: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74  r+5]);.  if( iSt
eb10: 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a  art<=x ){.    /*
eb20: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
eb30: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
eb40: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
eb50: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
eb60: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
eb70: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
eb80: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
eb90: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
eba0: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
ebb0: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
ebc0: 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c  .    if( iStart<
ebd0: 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31  x || iPtr!=hdr+1
ebe0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ebf0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ec00: 61 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  age);.    put2by
ec10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  te(&data[hdr+1],
ec20: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
ec30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ec40: 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20  dr+5], iEnd);.  
ec50: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
ec60: 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65  sert the new fre
ec70: 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20  eblock into the 
ec80: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20  freelist */.    
ec90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
eca0: 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20  Ptr], iStart);. 
ecb0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
ecc0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
ecd0: 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20  BTS_FAST_SECURE 
ece0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
ecf0: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
ed00: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
ed10: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
ed20: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
ed30: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
ed40: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
ed50: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
ed60: 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  0, iSize);.  }. 
ed70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ed80: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
ed90: 6b 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  k);.  put2byte(&
eda0: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
edb0: 69 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  iSize);.  pPage-
edc0: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
edd0: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
ede0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
edf0: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
ee00: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
ee10: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
ee20: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
ee30: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
ee40: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
ee50: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
ee60: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
ee70: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
ee80: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
ee90: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
eea0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
eeb0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
eec0: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
eed0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
eee0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
eef0: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
ef00: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
ef10: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
ef20: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
ef30: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
ef40: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
ef50: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ef60: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
ef70: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
ef80: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
ef90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
efa0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
efb0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
efc0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
efd0: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
efe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
eff0: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
f000: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
f010: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
f020: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f030: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f040: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
f050: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
f060: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
f070: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
f080: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
f090: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
f0a0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
f0b0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
f0c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
f0d0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
f0e0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
f0f0: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
f100: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
f110: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
f120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
f130: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f140: 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35  E-OF: R-07291-35
f150: 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35  328 A value of 5
f160: 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68   (0x05) means th
f170: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
f180: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62   ** interior tab
f190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
f1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
f1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
f1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f1e0: 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36  F: R-26900-09176
f1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28   A value of 13 (
f200: 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0d) means the 
f210: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
f220: 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72   leaf table b-tr
f230: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f240: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
f250: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
f260: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29  |PTF_LEAF)==13 )
f270: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f280: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Key = 1;.    if(
f290: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
f2a0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f2b0: 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20  KeyLeaf = 1;.   
f2c0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f2d0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f2e0: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
f2f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
f300: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f310: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
f320: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
f330: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
f340: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
f350: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
f360: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
f370: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
f380: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f390: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
f3a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
f3b0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
f3c0: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
f3d0: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
f3e0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
f3f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f400: 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76  -43316-37308 A v
f410: 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29  alue of 2 (0x02)
f420: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
f430: 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
f440: 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  erior index b-tr
f450: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f460: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
f470: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
f480: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f490: 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41   R-59615-42828 A
f4a0: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78   value of 10 (0x
f4b0: 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0a) means the pa
f4c0: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
f4d0: 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65  eaf index b-tree
f4e0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f4f0: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
f500: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
f510: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
f520: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
f530: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
f540: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
f550: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f560: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f570: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
f580: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
f590: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
f5a0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
f5b0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
f5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f5d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f5e0: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
f5f0: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
f600: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
f610: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
f620: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
f630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f640: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
f650: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
f660: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
f670: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
f680: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
f690: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f6a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
f6b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
f6c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
f6d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
f6e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
f6f0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
f700: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
f710: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
f720: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
f730: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
f740: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
f750: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
f760: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
f770: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
f780: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
f790: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
f7a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
f7b0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
f7c0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
f7d0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
f7e0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
f7f0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
f800: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
f810: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
f820: 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  age){.  int pc; 
f830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f840: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
f850: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
f860: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
f870: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
f880: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
f890: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
f8a0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
f8b0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
f8c0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
f8d0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
f8e0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f8f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
f900: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
f910: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
f920: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
f930: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
f940: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
f950: 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  */.  u16 cellOff
f960: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
f970: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
f980: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
f990: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
f9a0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
f9b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f9c0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
f9d0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
f9e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
f9f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
fa00: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
fa10: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
fa20: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
fa30: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
fa40: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
fa50: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
fa60: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
fa70: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
fa80: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
fa90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
faa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
fab0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
fac0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fad0: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
fae0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
faf0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
fb00: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fb10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fb20: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
fb30: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
fb40: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
fb50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
fb60: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
fb70: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
fb80: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fb90: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
fba0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
fbb0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
fbc0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
fbd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
fbe0: 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nit==0 );..  pBt
fbf0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
fc00: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
fc10: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
fc20: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fc30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
fc40: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
fc50: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
fc60: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
fc70: 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  dicating.  ** th
fc80: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
fc90: 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63  pe. */.  if( dec
fca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
fcb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20  data[hdr]) ){.  
fcc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fcd0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
fce0: 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
fcf0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
fd00: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
fd10: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
fd20: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
fd30: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
fd40: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
fd50: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
fd60: 77 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  w = 0;.  usableS
fd70: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
fd80: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
fd90: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
fda0: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
fdb0: 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  8 + pPage->child
fdc0: 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  PtrSize;.  pPage
fdd0: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
fde0: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
fdf0: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
fe00: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
fe10: 66 73 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  fset];.  pPage->
fe20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
fe30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
fe40: 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49  rSize];.  /* EVI
fe50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
fe60: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
fe70: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
fe80: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
fe90: 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  tes.  ** the sta
fea0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  rt of the cell c
feb0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a  ontent area. A z
fec0: 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ero value for th
fed0: 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20  is integer is.  
fee0: 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ** interpreted a
fef0: 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f  s 65536. */.  to
ff00: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ff10: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ff20: 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
ff30: 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37  -OF: R-37002-327
ff40: 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  74 The two-byte 
ff50: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
ff60: 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 3 gives the.  
ff70: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  ** number of cel
ff80: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ls on the page. 
ff90: 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  */.  pPage->nCel
ffa0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
ffb0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66  ta[hdr+3]);.  if
ffc0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
ffd0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
ffe0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
fff0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
10000 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
10010 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
10020 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
10030 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10040 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
10050 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
10060 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
10070 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56  (pBt) );.  /* EV
10080 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
10090 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61  89-57979 If a pa
100a0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
100b0 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f  ells (which is o
100c0 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c  nly.  ** possibl
100d0 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
100e0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
100f0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
10100 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ws) then the.  *
10110 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * offset to the 
10120 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
10130 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65  a will equal the
10140 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73   page size minus
10150 20 74 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20   the.  ** bytes 
10160 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
10170 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
10180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
10190 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
101a0 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
101b0 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  );..  /* A malfo
101c0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
101d0 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
101e0 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
101f0 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70  he end.  ** of p
10200 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  age when parsing
10210 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a   a cell.  .  **.
10220 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
10230 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
10240 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
10250 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
10260 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74  xtends.  ** past
10270 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
10280 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
10290 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
102a0 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 2a  RRUPT to be .  *
102b0 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  * returned if it
102c0 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43   does..  */.  iC
102d0 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
102e0 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
102f0 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  >nCell;.  iCellL
10300 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
10310 20 2d 20 34 3b 0a 20 20 69 66 28 20 70 42 74 2d   - 4;.  if( pBt-
10320 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
10330 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29  ITE_CellSizeCk )
10340 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
10350 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10360 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
10370 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
10380 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
10390 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
103a0 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
103b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
103c0 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
103d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
103e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
103f0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 67 65  ){.      pc = ge
10400 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
10410 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
10420 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  *2]);.      test
10430 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
10440 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65  irst );.      te
10450 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
10460 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 69  lLast );.      i
10470 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10480 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
10490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
104a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
104b0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
104c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20       }.      sz 
104d0 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
104e0 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
104f0 70 63 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  pc]);.      test
10500 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
10510 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
10520 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
10530 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10550 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10560 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10570 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
10580 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10590 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  st++;.  }  ..  /
105a0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
105b0 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
105c0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
105d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
105e0 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
105f0 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10600 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
10610 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74  s the.  ** start
10620 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72   of the first fr
10630 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  eeblock on the p
10640 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20  age, or is zero 
10650 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
10660 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
10670 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62   */.  pc = get2b
10680 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
10690 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74  );.  nFree = dat
106a0 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20  a[hdr+7] + top; 
106b0 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74   /* Init nFree t
106c0 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20  o non-freeblock 
106d0 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  free space */.  
106e0 69 66 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  if( pc>0 ){.    
106f0 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u32 next, size;.
10700 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
10710 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f  First ){.      /
10720 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10730 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
10740 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
10750 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
10760 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61   will.      ** a
10770 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61 73  lways be at leas
10780 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72  t one cell befor
10790 65 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  e the first free
107a0 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  block..      */.
107b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
107c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
107d0 28 70 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a  (pPage); .    }.
107e0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
107f0 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65        if( pc>iCe
10800 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10810 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f    /* Freeblock o
10820 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
10830 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
10840 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10850 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10860 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
10870 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
10880 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
10890 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
108a0 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
108b0 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d  );.      nFree =
108c0 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
108d0 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70       if( next<=p
108e0 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b  c+size+3 ) break
108f0 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
10900 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
10910 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20   next>0 ){.     
10920 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f   /* Freeblock no
10930 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
10940 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rder */.      re
10950 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10960 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10980 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64  c+size>(unsigned
10990 20 69 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20   int)usableSize 
109a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74  ){.      /* Last
109b0 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e   freeblock exten
109c0 64 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64  ds past page end
109d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
109e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
109f0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10a00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20   }.  }..  /* At 
10a10 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
10a20 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
10a30 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
10a40 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
10a50 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
10a60 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
10a70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
10a80 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
10a90 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63  .  ** the cell-c
10aa0 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
10ab0 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
10ac0 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
10ad0 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
10ae0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
10af0 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
10b00 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
10b10 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72  ck also.  ** ser
10b20 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
10b30 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
10b40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10b50 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
10b60 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
10b70 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
10b80 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
10b90 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
10ba0 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75  */.  if( nFree>u
10bb0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
10bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10bd0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10be0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
10bf0 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
10c00 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
10c10 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  t);.  pPage->isI
10c20 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  nit = 1;.  retur
10c30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10c40 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
10c50 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
10c60 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
10c70 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
10c80 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
10c90 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
10ca0 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
10cb0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
10cc0 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
10cd0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
10ce0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10cf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10d00 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
10d10 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
10d20 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
10d30 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
10d40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
10d50 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
10d60 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
10d70 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
10d80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
10d90 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10da0 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
10db0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
10dc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
10dd0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
10de0 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
10df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10e00 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
10e10 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
10e20 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10e30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10e40 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10e50 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
10e60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
10e70 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
10e80 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
10e90 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
10ea0 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
10eb0 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
10ec0 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
10ed0 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
10ee0 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
10ef0 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
10f00 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10f10 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
10f20 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
10f30 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10f40 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
10f50 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
10f60 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10f70 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
10f80 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
10f90 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
10fa0 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
10fb0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
10fc0 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
10fd0 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
10fe0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
10ff0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
11000 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
11010 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
11020 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
11030 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11040 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
11050 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
11060 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
11070 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
11080 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
11090 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
110a0 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
110b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
110c0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
110d0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
110e0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
110f0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
11100 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
11110 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
11120 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
11130 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
11140 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
11150 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
11160 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11170 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
11180 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
11190 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
111a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
111b0 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
111c0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
111d0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
111e0 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
111f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
11200 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
11210 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11220 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
11230 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
11240 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
11250 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
11260 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
11270 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
11280 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
11290 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
112a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
112b0 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
112c0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
112d0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
112e0 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
112f0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11300 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
11310 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
11320 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
11330 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
11340 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
11350 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
11360 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
11370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
11380 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
11390 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
113a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
113b0 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
113c0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
113d0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
113e0 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
113f0 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
11400 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
11410 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
11420 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
11430 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
11440 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
11450 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
11460 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
11470 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
11480 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
11490 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
114a0 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
114b0 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
114c0 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
114d0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
114e0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
114f0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
11500 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
11510 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
11520 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
11530 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
11540 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
11550 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
11560 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
11570 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
11580 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
11590 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
115a0 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
115b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
115c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
115d0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
115e0 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
115f0 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
11600 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
11610 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
11620 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
11630 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
11640 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
11650 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
11660 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
11670 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11680 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11690 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
116a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
116b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
116c0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
116d0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
116e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
116f0 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
11700 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
11710 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
11720 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
11730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11740 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
11750 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
11760 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
11770 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
11780 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
11790 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
117a0 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
117b0 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
117c0 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
117d0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
117e0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
117f0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
11800 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
11810 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
11820 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
11830 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
11840 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
11850 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11860 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11870 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
11880 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
11890 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
118a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
118b0 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
118c0 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
118d0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
118e0 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
118f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11900 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11910 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11920 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
11930 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
11940 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
11950 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
11960 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
11970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
11980 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
11990 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
119a0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
119b0 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
119c0 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
119d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
119e0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
119f0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
11a00 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
11a10 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
11a20 30 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  0000000)==0 );. 
11a30 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
11a40 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
11a50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
11a60 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
11a70 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
11a80 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  e it..**.** If p
11a90 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Cur!=0 then the 
11aa0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65  page is being fe
11ab0 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66  tched as part of
11ac0 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
11ad0 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64  .** call.  Do ad
11ae0 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20  ditional sanity 
11af0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
11b00 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
11b10 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  e..** And if the
11b20 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68   fetch fails, th
11b30 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
11b40 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e  decrement pCur->
11b50 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iPage..**.** The
11b60 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64   page is fetched
11b70 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75   as read-write u
11b80 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f  nless pCur is no
11b90 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a  t NULL and is.**
11ba0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
11bb0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  sor..**.** If an
11bc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
11bd0 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75  hen *ppPage is u
11be0 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20  ndefined. It.** 
11bf0 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61  may remain uncha
11c00 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20  nged, or it may 
11c10 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76  be set to an inv
11c20 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  alid value..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
11c40 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
11c50 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
11c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11c80 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11cb0 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
11cc0 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
11cd0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
11ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11cf0 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
11d00 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75  r here */.  BtCu
11d10 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
11d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11d30 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65  ursor to receive
11d40 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55   the page, or NU
11d50 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  LL */.  int bRea
11d60 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  dOnly           
11d70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11d80 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
11d90 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
11da0 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
11db0 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
11dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11dd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
11df0 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d  ur==0 || ppPage=
11e00 3d 26 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  =&pCur->pPage );
11e10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
11e20 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d  =0 || bReadOnly=
11e30 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46  =pCur->curPagerF
11e40 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74  lags );.  assert
11e50 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75  ( pCur==0 || pCu
11e60 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20  r->iPage>0 );.. 
11e70 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
11e80 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
11e90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11ea0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11eb0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11ec0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11ed0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11ee0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
11ef0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
11f00 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
11f10 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66  bReadOnly);.  if
11f20 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ( rc ){.    goto
11f30 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
11f40 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70  error;.  }.  *pp
11f50 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
11f60 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
11f70 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
11f80 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
11f90 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
11fa0 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44    btreePageFromD
11fb0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
11fc0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72  gno, pBt);.    r
11fd0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
11fe0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
11ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12000 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
12010 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
12020 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41  .      goto getA
12030 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
12040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
12050 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
12060 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
12070 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
12080 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  e)->aData==sqlit
12090 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
120a0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
120b0 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
120c0 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
120d0 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
120e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
120f0 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
12100 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
12110 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
12120 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28    if( pCur && ((
12130 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
12140 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
12150 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
12160 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20  rIntKey) ){.    
12170 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12180 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a  UPT_PGNO(pgno);.
12190 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
121a0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f  *ppPage);.    go
121b0 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
121c0 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
121d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
121e0 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  ..getAndInitPage
121f0 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43  _error:.  if( pC
12200 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ur ){.    pCur->
12210 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75  iPage--;.    pCu
12220 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
12230 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
12240 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age];.  }.  test
12250 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
12260 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
12270 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
12280 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
12290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
122a0 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
122b0 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
122c0 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
122d0 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
122e0 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
122f0 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  GetPage..**.** P
12300 61 67 65 31 20 69 73 20 61 20 73 70 65 63 69 61  age1 is a specia
12310 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20  l case and must 
12320 62 65 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  be released usin
12330 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  g releasePageOne
12340 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
12350 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
12360 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
12370 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
12380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
12390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
123a0 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
123b0 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
123c0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
123d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
123e0 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
123f0 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
12400 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
12410 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
12420 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
12430 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
12440 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12450 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12460 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12470 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
12480 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
12490 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
124a0 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
124b0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
124c0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
124d0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
124e0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
124f0 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74  ull(pPage);.}.st
12500 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
12510 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
12520 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
12530 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
12540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12550 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
12560 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
12570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12580 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
12590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
125a0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
125b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
125c0 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
125d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
125e0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
125f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
12600 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
12610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12620 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12630 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
12640 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
12650 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
12660 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
12670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
12680 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
12690 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
126a0 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
126b0 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
126c0 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
126d0 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
126e0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
126f0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
12700 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
12710 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
12720 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
12730 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
12740 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
12750 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
12760 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
12770 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
12780 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
12790 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
127a0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
127b0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
127c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
127d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
127e0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
127f0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
12800 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
12810 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12820 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
12830 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
12840 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12850 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12860 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12870 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12880 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12890 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
128a0 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
128b0 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
128c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
128d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
128e0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
128f0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
12900 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
12910 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
12920 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
12930 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
12940 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12950 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12960 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12970 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12980 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12990 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
129a0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
129b0 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
129c0 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
129d0 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
129e0 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
129f0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
12a00 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
12a10 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
12a20 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
12a30 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
12a40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
12a50 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12a60 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12a70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a90 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12aa0 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12ab0 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
12ac0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
12ad0 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
12ae0 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
12af0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
12b00 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
12b10 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
12b20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
12b30 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
12b40 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
12b50 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12b60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12b70 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12b80 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12b90 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12ba0 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12bb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12bc0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12bd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12be0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12bf0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12c00 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12c10 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
12c20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
12c30 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
12c40 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12c50 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12c60 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12c70 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12c80 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12c90 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12ca0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12cb0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12cc0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12cd0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12ce0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12cf0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
12d00 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
12d10 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
12d20 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
12d30 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
12d40 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12d50 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12d60 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12d70 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12d80 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12d90 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12da0 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12db0 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12dc0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12dd0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12de0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
12df0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12e00 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
12e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12e20 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
12e30 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
12e40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12e50 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12e60 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12e70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12e80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12e90 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12ea0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12eb0 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12ec0 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12ed0 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12ee0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
12f10 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
12f20 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  r));.}../*.** Op
12f30 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
12f40 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
12f50 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
12f60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12f70 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
12f80 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
12f90 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
12fa0 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
12fb0 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
12fc0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
12fd0 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
12fe0 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
12ff0 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
13000 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
13010 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
13020 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
13030 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
13040 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
13050 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
13060 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
13070 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
13080 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
13090 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
130a0 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
130b0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
130c0 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
130d0 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
130e0 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
130f0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
13100 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
13110 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
13120 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
13130 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
13140 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
13150 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
13160 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
13170 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
13180 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13190 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
131a0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
131b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
131c0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
131d0 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
131e0 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
131f0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
13200 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
13210 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
13220 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
13230 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
13240 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
13250 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
13260 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13270 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
13280 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
13290 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
132a0 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
132b0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
132c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
132d0 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
132e0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
132f0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
13300 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
13310 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
13320 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
13330 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
13340 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
13350 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
13360 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
13370 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13380 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
13390 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
133a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
133b0 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
133c0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
133d0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
133e0 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
133f0 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
13400 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
13410 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
13420 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
13430 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
13440 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
13450 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
13460 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
13470 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
13480 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
13490 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
134a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
134b0 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
134c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
134d0 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
134e0 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
134f0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
13500 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
13510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
13530 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
13540 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
13550 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
13560 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
13570 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
13580 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
13590 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
135a0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
135b0 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
135c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
135d0 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
135e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
135f0 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
13600 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
13610 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
13620 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
13630 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
13640 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
13650 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
13660 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
13670 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
13680 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
13690 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
136a0 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
136b0 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
136c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
136d0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
136e0 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
136f0 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
13700 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
13710 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
13720 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
13730 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
13740 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
13750 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
13760 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
13770 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
13780 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
13790 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
137a0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
137b0 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
137c0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
137d0 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
137e0 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
137f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13800 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
13810 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13820 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
13830 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
13840 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
13850 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
13860 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
13870 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
13880 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
13890 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
138a0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
138b0 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
138c0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
138d0 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
138e0 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
138f0 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
13900 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
13910 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
13920 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
13930 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13940 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
13950 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
13960 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
13970 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
13980 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
13990 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
139a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
139b0 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
139c0 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
139d0 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
139e0 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
139f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
13a00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
13a10 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
13a20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
13a30 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
13a40 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
13a50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a60 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
13a70 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
13a80 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
13a90 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
13aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13ab0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
13ac0 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
13ad0 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
13ae0 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
13af0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
13b00 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
13b10 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
13b20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
13b30 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
13b40 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
13b50 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
13b60 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
13b70 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
13b80 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
13b90 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
13ba0 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
13bb0 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
13bc0 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
13bd0 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
13be0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
13bf0 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
13c00 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
13c10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
13c20 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
13c30 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
13c40 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
13c50 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
13c60 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
13c70 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
13c80 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
13c90 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
13ca0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
13cb0 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
13cc0 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
13cd0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
13ce0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
13cf0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
13d00 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
13d10 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
13d20 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
13d30 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
13d40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13d50 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
13d60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13d70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
13d80 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
13d90 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
13da0 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
13db0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
13dc0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
13dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
13de0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
13df0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
13e00 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
13e30 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
13e40 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
13e50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
13e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13e70 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
13e80 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
13e90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13ea0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13eb0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
13ec0 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
13ed0 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
13ee0 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
13ef0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
13f00 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
13f10 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
13f20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13f30 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
13f40 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
13f50 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
13f60 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13f70 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
13f80 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
13f90 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
13fa0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
13fb0 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
13fc0 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
13fd0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13fe0 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
13ff0 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
14000 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14010 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
14020 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
14030 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
14040 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
14050 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
14060 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
14080 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
14090 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
140a0 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
140b0 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
140c0 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
140d0 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
140e0 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
140f0 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
14100 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
14110 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
14120 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
14130 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
14140 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
14150 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14160 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
14170 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
14180 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14190 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
141a0 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
141b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
141c0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
141d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
141e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
141f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14210 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
14220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14240 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
14250 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
14260 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
14270 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14290 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
142a0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
142b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
142c0 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
142d0 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
142e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
142f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
14300 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
14310 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
14320 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
14330 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
14340 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
14350 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
14360 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
14370 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
14380 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
14390 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
143a0 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
143b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
143c0 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
143d0 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
143e0 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
143f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14400 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
14410 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14420 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
14430 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
14440 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
14450 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
14460 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
14470 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
14480 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
14490 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
144a0 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
144b0 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
144c0 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
144d0 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
144e0 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
144f0 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
14500 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
14510 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14520 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
14530 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14540 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
14550 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14560 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
14570 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
14580 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
14590 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
145a0 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
145b0 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
145c0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
145d0 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
145e0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
145f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14600 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
14610 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14620 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
14630 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
14640 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
14650 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
14660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14670 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
14680 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61  of(MemPage), fla
14690 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
146a0 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
146b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
146c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
146d0 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
146e0 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
146f0 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
14700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14710 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
14720 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
14730 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
14740 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
14750 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
14760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14770 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
14780 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
14790 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
147a0 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
147b0 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
147c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
147d0 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  etBusyHandler(pB
147e0 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
147f0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
14800 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
14810 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
14820 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
14830 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
14840 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
14850 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
14860 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
14870 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
14880 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
14890 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e  _ONLY;.#if defin
148a0 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ed(SQLITE_SECURE
148b0 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74  _DELETE).    pBt
148c0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
148d0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
148e0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
148f0 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52  QLITE_FAST_SECUR
14900 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42  E_DELETE).    pB
14910 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14920 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65  TS_OVERWRITE;.#e
14930 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44  ndif.    /* EVID
14940 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
14950 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
14960 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
14970 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
14980 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
14990 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
149a0 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
149b0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
149c0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
149d0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
149e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
149f0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d  ile. */.    pBt-
14a00 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
14a10 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
14a20 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
14a30 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
14a40 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
14a50 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
14a60 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
14a70 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
14a80 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
14a90 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
14aa0 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
14ab0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
14ac0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
14ad0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14ae0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
14af0 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
14b00 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
14b10 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
14b20 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
14b30 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
14b40 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
14b50 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
14b60 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
14b70 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
14b80 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14b90 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
14ba0 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
14bb0 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
14bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
14bd0 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
14be0 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
14bf0 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
14c00 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
14c10 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
14c20 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
14c30 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
14c40 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
14c50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14c60 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
14c70 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
14c80 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
14c90 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
14ca0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
14cb0 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
14cc0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
14cd0 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
14ce0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
14cf0 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
14d00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
14d10 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
14d20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14d30 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
14d40 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
14d50 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
14d60 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
14d70 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74   is.      ** det
14d80 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
14d90 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
14da0 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
14db0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
14dc0 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  0.      ** into 
14dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14de0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
14df0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
14e00 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
14e10 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14e20 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
14e30 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
14e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14e50 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
14e60 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
14e70 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
14e80 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
14e90 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
14ea0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
14eb0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
14ec0 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
14ed0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
14ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14ef0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
14f00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
14f10 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
14f20 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
14f30 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
14f40 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
14f50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
14f60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
14f70 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
14f80 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
14f90 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
14fa0 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
14fb0 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
14fc0 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
14fd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14fe0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
14ff0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15000 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
15010 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
15020 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
15030 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
15040 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
15050 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
15060 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d  .    pBt->nRef =
15070 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   1;.    if( p->s
15080 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
15090 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
150a0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
150b0 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
150c0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
150d0 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
150e0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
150f0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
15100 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
15110 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
15120 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
15130 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15140 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
15150 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
15160 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15170 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
15180 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
15190 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
151a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
151b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
151c0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
151d0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
151e0 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
151f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15210 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
15220 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
15230 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
15240 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15250 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
15260 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
15270 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15280 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
15290 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
152a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
152b0 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
152c0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
152d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
152e0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
152f0 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
15300 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
15310 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
15320 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
15330 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
15340 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
15350 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
15360 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
15370 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
15380 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
15390 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
153a0 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
153b0 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
153c0 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
153d0 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
153e0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
153f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
15400 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
15410 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
15420 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
15430 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
15440 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
15450 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
15460 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
15470 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
15480 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
15490 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
154a0 20 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d      if( (uptr)p-
154b0 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d  >pBt<(uptr)pSib-
154c0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
154d0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
154e0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
154f0 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
15500 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
15510 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
15520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
15530 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
15540 74 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d  t && (uptr)pSib-
15550 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74  >pNext->pBt<(upt
15560 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  r)p->pBt ){.    
15570 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
15580 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
15590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
155a0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
155b0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
155c0 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
155d0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
155e0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
155f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
15600 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
15610 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15620 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
15630 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
15640 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15650 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15660 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
15670 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
15680 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
15690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
156a0 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
156b0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
156c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
156d0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
156e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
156f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15700 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
15710 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
15720 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
15730 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15740 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20  _file *pFile;.. 
15750 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
15760 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
15770 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
15780 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
15790 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
157a0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
157b0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
157c0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
157d0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
157e0 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
157f0 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
15800 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
15810 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
15820 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15830 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
15840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
15850 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15860 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
15870 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
15880 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
15890 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69  ;.    }..    pFi
158a0 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
158b0 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
158c0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  r);.    if( pFil
158d0 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  e->pMethods ){. 
158e0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69       sqlite3OsFi
158f0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46  leControlHint(pF
15900 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ile, SQLITE_FCNT
15910 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70  L_PDB, (void*)&p
15920 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  Bt->db);.    }. 
15930 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
15940 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
15950 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15960 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
15970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
15980 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
15990 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Open);.  }.  ass
159a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
159b0 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  OK || sqlite3Btr
159c0 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e  eeConnectionCoun
159d0 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b  t(*ppBtree)>0 );
159e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
159f0 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
15a00 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
15a10 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
15a20 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
15a30 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
15a40 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
15a50 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
15a60 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
15a70 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
15a80 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
15a90 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
15aa0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
15ab0 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
15ac0 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
15ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15ae0 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
15af0 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
15b00 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
15b10 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15b20 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c  _CACHE.  MUTEX_L
15b30 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
15b40 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a  tex *pMaster; ).
15b50 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
15b60 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
15b70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
15b80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
15b90 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
15ba0 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  x) );.  MUTEX_LO
15bb0 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
15bc0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
15bd0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
15be0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
15bf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15c00 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
15c10 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
15c20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
15c30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
15c40 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
15c50 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
15c60 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
15c70 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
15c80 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15c90 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
15ca0 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
15cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
15cc0 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
15cd0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15ce0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
15cf0 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
15d00 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
15d10 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
15d20 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
15d30 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
15d40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
15d50 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
15d60 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
15d70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
15d80 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
15d90 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
15da0 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
15db0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15dc0 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
15dd0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
15de0 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
15df0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15e00 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
15e10 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
15e20 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
15e30 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
15e40 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
15e50 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
15e60 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
15e70 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
15e80 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
15e90 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65  es with a 4-byte
15ea0 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65   prefix for a le
15eb0 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e  ft-child.** poin
15ec0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
15ed0 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
15ee0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
15ef0 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
15f00 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
15f10 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15f20 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
15f30 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
15f40 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
15f50 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20  One of the uses 
15f60 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  of pBt->pTmpSpac
15f70 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63  e is to format c
15f80 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20  ells before.    
15f90 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65  ** inserting the
15fa0 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61  m into a leaf pa
15fb0 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c  ge (function fil
15fc0 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20  lInCell()). If. 
15fd0 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20     ** a cell is 
15fe0 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65  less than 4 byte
15ff0 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73  s in size, it is
16000 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
16010 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79   bytes.    ** by
16020 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75   the various rou
16030 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70  tines that manip
16040 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c  ulate binary cel
16050 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a  ls. Which.    **
16060 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66   can mean that f
16070 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79  illInCell() only
16080 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
16090 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20   first 2 or 3.  
160a0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54    ** bytes of pT
160b0 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61  mpSpace, but tha
160c0 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  t the first 4 by
160d0 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66  tes are copied f
160e0 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e  rom.    ** it in
160f0 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61  to a database pa
16100 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ge. This is not 
16110 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c  actually a probl
16120 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a  em, but it.    *
16130 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76  * does cause a v
16140 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68  algrind error wh
16150 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79  en the 1 or 2 by
16160 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a  tes of unitializ
16170 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ed .    ** data 
16180 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73  is passed to sys
16190 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29  tem call write()
161a0 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68  . So to avoid th
161b0 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a  is error,.    **
161c0 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
161d0 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20  4 bytes of temp 
161e0 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20  space here..    
161f0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20  **.    ** Also: 
16200 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79   Provide four by
16210 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  tes of initializ
16220 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ed space before 
16230 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e  the.    ** begin
16240 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63  ning of pTmpSpac
16250 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61  e as an area ava
16260 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e  ilable to prepen
16270 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66  d the.    ** lef
16280 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
16290 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
162a0 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20   of a cell..    
162b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  */.    if( pBt->
162c0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
162d0 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70     memset(pBt->p
162e0 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b  TmpSpace, 0, 8);
162f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  .      pBt->pTmp
16300 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20  Space += 4;.    
16310 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
16320 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
16330 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
16340 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
16350 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
16360 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16370 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
16380 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
16390 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a  pTmpSpace -= 4;.
163a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
163b0 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  ree(pBt->pTmpSpa
163c0 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54  ce);.    pBt->pT
163d0 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d  mpSpace = 0;.  }
163e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
163f0 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
16400 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
16410 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
16420 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16430 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
16440 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16450 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
16460 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
16470 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
16480 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
16490 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
164a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
164b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
164c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
164d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
164e0 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20  er(p);.  pCur = 
164f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
16500 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
16510 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
16520 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
16530 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
16540 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
16550 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
16560 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
16570 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
16580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16590 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
165a0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
165b0 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
165c0 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
165d0 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
165e0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
165f0 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
16600 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
16610 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
16620 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
16630 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
16640 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f  back(p, SQLITE_O
16650 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
16660 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
16670 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
16680 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
16690 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
166a0 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
166b0 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
166c0 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
166d0 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
166e0 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
166f0 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
16700 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
16710 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
16720 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
16730 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
16740 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
16750 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
16760 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
16770 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
16780 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
16790 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
167a0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
167b0 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
167c0 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
167d0 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
167e0 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
167f0 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
16800 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
16810 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
16820 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
16830 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
16840 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
16850 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
16860 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
16870 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
16880 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
16890 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
168a0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
168b0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
168c0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
168d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
168e0 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
168f0 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
16900 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
16910 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
16920 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
16930 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
16940 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
16950 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
16960 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
16970 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
16980 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
16990 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
169a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
169b0 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
169c0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
169d0 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
169e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
169f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16a00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
16a10 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20  ange the "soft" 
16a20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
16a30 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
16a40 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e  the cache..** Un
16a50 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66  used and unmodif
16a60 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62  ied pages will b
16a70 65 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20  e recycled when 
16a80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
16a90 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
16aa0 63 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73  che exceeds this
16ab0 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75   soft limit.  Bu
16ac0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
16ad0 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c  e.** cache is al
16ae0 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61  lowed to grow la
16af0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c  rger than this l
16b00 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61  imit if it conta
16b10 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  ins.** dirty pag
16b20 65 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c  es or pages stil
16b30 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e  l in active use.
16b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16b50 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
16b60 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
16b70 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
16b80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16b90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16ba0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16bb0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16bc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16bd0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
16be0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
16bf0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
16c00 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
16c10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16c20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16c30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
16c40 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22  ange the "spill"
16c50 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
16c60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
16c70 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49   the cache..** I
16c80 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
16c90 70 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68  pages exceeds th
16ca0 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20  is limit during 
16cb0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
16cc0 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ion,.** the page
16cd0 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20  r might attempt 
16ce0 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73  to "spill" pages
16cf0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
16d00 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65  early in.** orde
16d10 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
16d20 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ory..**.** The v
16d30 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
16d40 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69   the current spi
16d50 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72  ll size.  If zer
16d60 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61  o is passed.** a
16d70 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e  s an argument, n
16d80 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
16d90 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20  de to the spill 
16da0 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f  size setting, so
16db0 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65  .** using mxPage
16dc0 20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74   of 0 is a way t
16dd0 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72  o query the curr
16de0 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a  ent spill size..
16df0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16e00 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
16e10 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
16e20 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
16e30 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16e40 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
16e50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16e60 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16e70 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16e80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16e90 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
16ea0 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
16eb0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
16ec0 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
16ed0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16ee0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
16ef0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
16f00 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
16f10 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
16f20 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
16f30 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
16f40 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
16f50 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
16f60 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
16f70 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
16f80 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
16f90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
16fa0 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
16fb0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16fc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16fd0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16fe0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16ff0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17000 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
17010 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
17020 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
17030 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
17040 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17060 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
17070 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
17080 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
17090 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
170a0 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
170b0 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
170c0 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
170d0 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
170e0 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
170f0 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
17100 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
17110 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
17120 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
17130 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
17140 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
17150 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
17160 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
17170 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
17180 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
17190 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
171a0 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
171b0 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
171c0 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
171d0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
171e0 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
171f0 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
17200 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
17210 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
17220 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
17230 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
17240 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
17250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
17260 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
17270 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
17280 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
17290 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
172a0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
172b0 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
172c0 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
172d0 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
172e0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
172f0 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
17300 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
17310 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
17320 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17330 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
17340 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
17350 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17360 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
17370 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
17380 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
17390 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
173a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
173b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
173c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
173d0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
173e0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
173f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17400 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
17410 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
17420 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
17430 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17440 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
17450 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
17460 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
17470 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
17480 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
17490 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
174a0 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
174b0 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
174c0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
174d0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
174e0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
174f0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
17500 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
17510 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
17520 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
17530 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
17540 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
17550 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
17560 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
17570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17580 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
17590 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
175a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
175b0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
175c0 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
175d0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
175e0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
175f0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
17600 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
17610 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
17620 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
17630 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
17640 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
17650 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
17660 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
17670 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
17680 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
17690 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
176a0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
176b0 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
176c0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
176d0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
176e0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
176f0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
17700 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
17710 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
17720 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
17730 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
17740 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
17750 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
17760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
17770 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17780 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
17790 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
177a0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
177b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
177c0 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49  ter(p);.#if SQLI
177d0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
177e0 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d  f( nReserve>pBt-
177f0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
17800 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ) pBt->optimalRe
17810 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73  serve = (u8)nRes
17820 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  erve;.#endif.  i
17830 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
17840 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
17850 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
17860 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17870 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17880 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17890 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
178a0 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
178b0 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
178c0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
178d0 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
178e0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
178f0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
17900 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
17910 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
17920 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
17930 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
17940 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
17950 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
17960 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17970 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
17980 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17990 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
179a0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
179b0 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
179c0 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
179d0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
179e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
179f0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
17a00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
17a10 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
17a20 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
17a30 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
17a40 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
17a50 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
17a60 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
17a70 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
17a80 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
17a90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17aa0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17ac0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
17ad0 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
17ae0 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
17af0 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
17b00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
17b10 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
17b20 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
17b30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
17b40 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
17b50 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
17b60 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
17b70 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
17b80 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
17b90 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
17ba0 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
17bb0 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
17bc0 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
17bd0 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
17be0 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
17bf0 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
17c00 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
17c10 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
17c20 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
17c30 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
17c40 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
17c50 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
17c60 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
17c70 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
17c80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
17c90 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
17ca0 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
17cb0 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
17cc0 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
17cd0 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
17ce0 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
17cf0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17d00 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
17d10 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
17d20 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
17d30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
17d40 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
17d50 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
17d60 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   n;.  assert( sq
17d70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17d80 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
17d90 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
17da0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
17db0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
17dc0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
17dd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17de0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17df0 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
17e00 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
17e10 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
17e20 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
17e30 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
17e40 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
17e50 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
17e60 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
17e70 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a  y extensions..**
17e80 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41  .** If SQLITE_HA
17e90 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e  S_MUTEX is defin
17ea0 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed then the numb
17eb0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  er returned is t
17ec0 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66  he.** greater of
17ed0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
17ee0 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20  erved space and 
17ef0 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75  the maximum requ
17f00 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65  ested.** reserve
17f10 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73   space..*/.int s
17f20 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70  qlite3BtreeGetOp
17f30 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72  timalReserve(Btr
17f40 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
17f50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17f60 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
17f70 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17f80 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b  serveNoMutex(p);
17f90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
17fa0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
17fb0 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  <p->pBt->optimal
17fc0 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d  Reserve ) n = p-
17fd0 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17fe0 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73  erve;.#endif.  s
17ff0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18000 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
18010 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
18020 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
18030 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
18040 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
18050 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
18060 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
18070 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
18080 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
18090 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
180a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
180b0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
180c0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
180d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
180e0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
180f0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
18100 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
18110 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
18120 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
18130 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
18140 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
18150 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
18160 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
18170 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18180 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
18190 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
181a0 65 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53  es for the BTS_S
181b0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
181c0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66   BTS_OVERWRITE f
181d0 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e  lags:.**.**    n
181e0 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20  ewFlag==0       
181f0 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f  Both BTS_SECURE_
18200 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f  DELETE and BTS_O
18210 56 45 52 57 52 49 54 45 20 61 72 65 20 63 6c 65  VERWRITE are cle
18220 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
18230 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f  ag==1       BTS_
18240 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65  SECURE_DELETE se
18250 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  t and BTS_OVERWR
18260 49 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a  ITE is cleared.*
18270 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20  *    newFlag==2 
18280 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45        BTS_SECURE
18290 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20  _DELETE cleared 
182a0 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
182b0 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e  E is set.**    n
182c0 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20  ewFlag==(-1)    
182d0 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a  No changes.**.**
182e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
182f0 74 73 20 61 73 20 61 20 71 75 65 72 79 20 69 66  ts as a query if
18300 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73   newFlag is less
18310 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a   than zero.**.**
18320 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52   With BTS_OVERWR
18330 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64  ITE set, deleted
18340 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72   content is over
18350 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73  written by zeros
18360 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73  , but.** freelis
18370 74 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65  t leaf pages are
18380 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63   not written bac
18390 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
183a0 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65  e.  Thus in-page
183b0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  .** deleted cont
183c0 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ent is cleared, 
183d0 62 75 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c  but freelist del
183e0 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
183f0 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  not..**.** With 
18400 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18410 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  E, operation is 
18420 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49  like BTS_OVERWRI
18430 54 45 20 77 69 74 68 20 74 68 65 20 61 64 64 69  TE with the addi
18440 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65  tion.** that fre
18450 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  elist leaf pages
18460 20 61 72 65 20 77 72 69 74 74 65 6e 20 62 61 63   are written bac
18470 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
18480 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a  ase, increasing.
18490 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ** the amount of
184a0 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e   disk I/O..*/.in
184b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
184c0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
184d0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
184e0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
184f0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
18500 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
18510 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
18520 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49  ert( BTS_OVERWRI
18530 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44  TE==BTS_SECURE_D
18540 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73  ELETE*2 );.  ass
18550 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45  ert( BTS_FAST_SE
18560 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57  CURE==(BTS_OVERW
18570 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f  RITE|BTS_SECURE_
18580 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28  DELETE) );.  if(
18590 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
185a0 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
185b0 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54  ags &= ~BTS_FAST
185c0 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e  _SECURE;.    p->
185d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
185e0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
185f0 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a  TE*newFlag;.  }.
18600 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
18610 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41  tsFlags & BTS_FA
18620 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53  ST_SECURE)/BTS_S
18630 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
18640 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18650 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
18660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
18670 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
18680 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
18690 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
186a0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
186b0 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
186c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
186d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
186e0 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
186f0 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
18700 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
18710 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
18720 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
18730 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
18740 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
18750 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
18760 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
18770 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
18780 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
18790 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
187a0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
187b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
187c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
187d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
187e0 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
187f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18800 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
18810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
18820 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
18830 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
18840 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18850 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
18860 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
18870 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
18880 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
18890 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
188a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
188b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
188c0 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
188d0 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
188e0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
188f0 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
18900 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
18910 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18920 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
18930 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
18940 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
18950 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
18960 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
18970 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
18980 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
18990 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
189a0 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
189b0 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
189c0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
189d0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
189e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
189f0 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
18a00 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
18a10 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
18a20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18a30 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
18a40 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
18a50 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
18a60 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
18a70 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
18a80 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
18a90 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
18aa0 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
18ab0 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
18ac0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18ad0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18ae0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
18af0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  ./*.** If the us
18b00 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74  er has not set t
18b10 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
18b20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
18b30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
18b40 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79  using "PRAGMA sy
18b50 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20  nchronous", and 
18b60 69 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65  if the safety-le
18b70 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  vel is not alrea
18b80 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  dy.** set to the
18b90 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   value passed to
18ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18bb0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
18bc0 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69  ameter,.** set i
18bd0 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  t so..*/.#if SQL
18be0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
18bf0 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f  HRONOUS!=SQLITE_
18c00 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
18c10 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26  HRONOUS \.    &&
18c20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18c30 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69  _OMIT_WAL).stati
18c40 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c  c void setDefaul
18c50 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72  tSyncFlag(BtShar
18c60 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65  ed *pBt, u8 safe
18c70 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c  ty_level){.  sql
18c80 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
18c90 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70  pDb;.  if( (db=p
18ca0 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
18cb0 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
18cc0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  {.    while( pDb
18cd0 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d  ->pBt==0 || pDb-
18ce0 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29  >pBt->pBt!=pBt )
18cf0 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69  { pDb++; }.    i
18d00 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74  f( pDb->bSyncSet
18d10 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62  ==0 .     && pDb
18d20 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ->safety_level!=
18d30 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20  safety_level .  
18d40 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e     && pDb!=&db->
18d50 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20  aDb[1] .    ){. 
18d60 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
18d70 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f  _level = safety_
18d80 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c  level;.      sql
18d90 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
18da0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20  s(pBt->pPager,. 
18db0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
18dc0 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
18dd0 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
18de0 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
18df0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
18e00 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61  # define setDefa
18e10 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
18e20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65  safety_level).#e
18e30 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
18e40 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
18e50 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
18e60 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 2a  tabase(BtShared*
18e70 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  );.../*.** Get a
18e80 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
18e90 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
18ea0 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
18eb0 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
18ec0 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
18ed0 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
18ee0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
18ef0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
18f00 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
18f10 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
18f20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
18f30 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
18f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
18f50 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
18f60 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
18f70 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
18f80 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
18f90 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
18fa0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
18fb0 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
18fc0 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
18fd0 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
18fe0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
18ff0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
19000 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
19010 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
19020 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
19030 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
19040 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
19050 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19060 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
19070 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19080 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19090 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
190a0 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
190b0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
190c0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
190d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
190e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
190f0 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
19100 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
19110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
19120 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
19130 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
19140 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19150 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19160 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
19170 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
19180 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
19190 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
191a0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
191b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
191c0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
191d0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
191e0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
191f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19200 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19210 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
19220 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
19230 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
19240 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
19250 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
19260 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
19270 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
19280 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
19290 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
192a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
192b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
192c0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
192d0 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
192e0 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
192f0 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
19300 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
19310 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
19320 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
19330 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
19340 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
19350 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  ( (pBt->db->flag
19360 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74  s & SQLITE_Reset
19370 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 7b 0a  Database)!=0 ){.
19380 20 20 20 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20      nPage = 0;. 
19390 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30   }.  if( nPage>0
193a0 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65   ){.    u32 page
193b0 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73  Size;.    u32 us
193c0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
193d0 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
193e0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
193f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
19400 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19410 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39  -OF: R-43737-399
19420 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53  99 Every valid S
19430 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66  QLite database f
19440 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a  ile begins.    *
19450 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  * with the follo
19460 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69  wing 16 bytes (i
19470 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63  n hex): 53 51 4c
19480 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20   69 74 65 20 66 
19490 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20  6f 72 6d.    ** 
194a0 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20  61 74 20 33 00. 
194b0 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
194c0 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
194d0 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
194e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
194f0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19500 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
19510 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
19520 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
19530 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
19540 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
19550 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
19560 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
19570 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
19580 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
19590 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
195a0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
195b0 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
195c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
195d0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
195e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
195f0 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
19600 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19610 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
19620 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
19630 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
19640 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
19650 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
19660 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
19670 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
19680 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
19690 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
196a0 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
196b0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
196c0 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
196d0 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
196e0 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
196f0 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
19700 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
19710 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
19720 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
19730 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
19740 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
19750 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
19760 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
19770 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
19780 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
19790 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
197a0 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
197b0 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
197c0 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
197d0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
197e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
197f0 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
19800 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
19810 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
19820 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
19830 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
19840 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
19850 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
19860 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
19870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
19890 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
198a0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
198b0 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44 65  e{.        setDe
198c0 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
198d0 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
198e0 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55  T_WAL_SYNCHRONOU
198f0 53 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  S+1);.        if
19900 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ( isOpen==0 ){. 
19910 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
19920 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
19930 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
19940 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19960 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19970 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c  _NOTADB;.    }el
19980 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66  se{.      setDef
19990 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
199a0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
199b0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
199c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
199d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
199e0 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
199f0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
19a00 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
19a10 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
19a20 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
19a30 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
19a40 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
19a50 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
19a60 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
19a70 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
19a80 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
19a90 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
19aa0 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
19ab0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
19ac0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
19ad0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
19ae0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
19af0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
19b00 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
19b10 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
19b20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19b30 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19b40 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
19b50 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
19b60 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
19b70 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
19b80 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
19b90 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
19ba0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
19bb0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
19bc0 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
19bd0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
19be0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
19bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19c00 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
19c10 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
19c20 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
19c30 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
19c40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
19c50 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
19c60 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
19c70 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
19c80 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
19c90 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
19ca0 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
19cb0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
19cc0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
19cd0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
19ce0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
19cf0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
19d00 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
19d10 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19d20 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19d30 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19d40 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19d50 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
19d60 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
19d70 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
19d80 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
19d90 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
19da0 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
19db0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
19dc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19dd0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
19de0 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
19df0 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
19e00 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
19e10 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
19e20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
19e30 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19e40 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19e50 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
19e60 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19e70 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
19e80 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
19e90 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
19ea0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
19eb0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
19ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
19ed0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
19ee0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
19ef0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
19f00 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
19f10 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
19f20 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
19f30 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19f40 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19f50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19f60 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
19f70 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
19f80 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
19f90 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
19fa0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
19fb0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
19fc0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
19fd0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
19fe0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
19ff0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
1a000 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
1a010 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1a020 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
1a030 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
1a040 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
1a050 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
1a060 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
1a070 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1a080 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
1a090 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
1a0a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1a0b0 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
1a0c0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
1a0d0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
1a0e0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
1a0f0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
1a100 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1a110 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
1a120 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
1a130 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
1a160 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
1a170 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1a180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a190 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
1a1a0 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  & SQLITE_WriteSc
1a1b0 68 65 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61 67  hema)==0 && nPag
1a1c0 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20  e>nPageFile ){. 
1a1d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a1e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1a1f0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a200 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a210 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
1a220 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36  CE-OF: R-28312-6
1a230 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68  4704 However, th
1a240 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73  e usable size is
1a250 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a   not allowed to.
1a260 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74      ** be less t
1a270 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65  han 480. In othe
1a280 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
1a290 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32  page size is 512
1a2a0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
1a2b0 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  * reserved space
1a2c0 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63   size cannot exc
1a2d0 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69  eed 32. */.    i
1a2e0 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38  f( usableSize<48
1a2f0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
1a300 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a310 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  d;.    }.    pBt
1a320 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
1a330 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
1a340 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
1a350 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
1a360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a370 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
1a380 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
1a390 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
1a3a0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
1a3b0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
1a3c0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
1a3d0 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
1a3e0 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
1a3f0 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
1a400 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
1a410 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
1a420 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
1a430 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
1a440 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
1a450 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
1a460 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
1a470 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
1a480 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
1a490 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
1a4a0 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
1a4b0 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
1a4c0 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
1a4d0 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
1a4e0 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
1a4f0 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
1a500 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
1a510 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
1a520 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
1a530 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
1a540 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
1a550 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
1a560 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
1a570 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
1a580 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
1a590 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
1a5a0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
1a5b0 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20  2-byte pointer, 
1a5c0 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
1a5d0 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
1a5e0 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
1a5f0 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
1a600 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
1a610 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
1a620 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
1a630 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
1a640 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
1a650 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
1a660 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
1a670 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  4/255 - 23);.  p
1a680 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
1a690 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
1a6a0 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
1a6b0 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
1a6c0 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70  axLeaf = (u16)(p
1a6d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1a6e0 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   35);.  pBt->min
1a6f0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42  Leaf = (u16)((pB
1a700 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
1a710 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
1a720 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f    if( pBt->maxLo
1a730 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70  cal>127 ){.    p
1a740 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
1a750 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c  oad = 127;.  }el
1a760 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  se{.    pBt->max
1a770 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28  1bytePayload = (
1a780 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  u8)pBt->maxLocal
1a790 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a7a0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
1a7b0 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
1a7c0 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
1a7d0 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
1a7e0 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
1a7f0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
1a800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
1a810 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
1a820 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
1a830 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
1a840 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
1a850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1a860 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
1a870 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1a880 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f  ber of cursors o
1a890 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73  pen on pBt. This
1a8a0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
1a8b0 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
1a8c0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
1a8d0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
1a8e0 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
1a8f0 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
1a900 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
1a910 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
1a920 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72   if wrOnly is tr
1a930 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69  ue.  If wrOnly i
1a940 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20  s.** false then 
1a950 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
1a960 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  counted..**.** F
1a970 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
1a980 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
1a990 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79   a cursor is any
1a9a0 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
1a9b0 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65  is capable of re
1a9c0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1a9d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a9e0 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a  .  Cursors that.
1a9f0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69  ** have been tri
1aa00 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55  pped into the CU
1aa10 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65  RSOR_FAULT state
1aa20 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64   are not counted
1aa30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aa40 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1aa50 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
1aa60 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20   int wrOnly){.  
1aa70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
1aa80 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
1aa90 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
1aaa0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
1aab0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
1aac0 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d     if( (wrOnly==
1aad0 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46  0 || (pCur->curF
1aae0 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
1aaf0 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20  eFlag)!=0).     
1ab00 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
1ab10 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
1ab20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
1ab30 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
1ab40 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
1ab50 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
1ab60 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
1ab70 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1ab80 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
1ab90 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
1aba0 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
1abb0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1abc0 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
1abd0 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
1abe0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1abf0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ac00 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
1ac10 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
1ac20 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
1ac30 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
1ac40 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
1ac50 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
1ac60 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
1ac70 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1ac80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1ac90 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1aca0 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
1acb0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1acc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1acd0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1ace0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
1acf0 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30  lidCursors(pBt,0
1ad00 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  )==0 || pBt->inT
1ad10 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
1ad20 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
1ad30 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ad40 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1ad50 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
1ad60 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
1ad70 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1ad80 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74  age1;.    assert
1ad90 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ( pPage1->aData 
1ada0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1adb0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1adc0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1add0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==1 );.    pBt->
1ade0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
1adf0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
1ae00 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Page1);.  }.}../
1ae10 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
1ae20 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
1ae30 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
1ae40 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
1ae50 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
1ae60 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
1ae70 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
1ae80 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
1ae90 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
1aea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
1aeb0 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
1aec0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
1aed0 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
1aee0 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
1aef0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1af00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1af10 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1af20 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
1af30 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
1af40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1af50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
1af60 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1af70 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
1af80 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
1af90 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
1afa0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1afb0 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
1afc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1afd0 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
1afe0 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
1aff0 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
1b000 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
1b010 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
1b020 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
1b030 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
1b040 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
1b050 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
1b060 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
1b070 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
1b080 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1b090 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
1b0a0 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
1b0b0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
1b0c0 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
1b0d0 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
1b0e0 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
1b0f0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
1b100 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
1b110 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
1b120 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
1b130 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
1b140 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
1b150 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
1b160 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
1b170 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
1b180 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
1b190 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
1b1a0 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
1b1b0 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
1b1c0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
1b1d0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
1b1e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1b1f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
1b200 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
1b210 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
1b220 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
1b230 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1b240 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
1b250 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1b260 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
1b270 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
1b280 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
1b290 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
1b2a0 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
1b2b0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
1b2c0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
1b2d0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
1b2e0 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
1b2f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b300 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1b310 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
1b320 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1b330 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
1b340 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
1b350 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
1b360 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
1b370 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
1b380 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
1b390 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
1b3a0 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
1b3b0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
1b3c0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
1b3d0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
1b3e0 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
1b3f0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1b400 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1b410 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
1b420 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
1b430 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
1b440 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b450 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
1b470 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
1b480 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1b490 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
1b4a0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
1b4b0 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
1b4c0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
1b4d0 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
1b4e0 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
1b4f0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
1b500 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1b510 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
1b520 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
1b530 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1b540 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
1b550 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
1b560 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
1b570 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
1b580 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
1b590 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
1b5a0 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
1b5b0 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
1b5c0 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
1b5d0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
1b5e0 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
1b5f0 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
1b600 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
1b610 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
1b620 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1b630 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
1b640 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
1b650 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
1b660 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
1b670 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1b680 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
1b690 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1b6a0 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
1b6b0 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
1b6c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1b6d0 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
1b6e0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1b6f0 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
1b700 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b710 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
1b720 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
1b730 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
1b740 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1b750 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
1b760 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1b770 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
1b780 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b790 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
1b7a0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b7b0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
1b7c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
1b7d0 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
1b7e0 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
1b7f0 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
1b800 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
1b810 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
1b820 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
1b830 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
1b840 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
1b850 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
1b860 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
1b870 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
1b880 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
1b890 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
1b8a0 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
1b8b0 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
1b8c0 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
1b8d0 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
1b8e0 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
1b8f0 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
1b900 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
1b910 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
1b920 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
1b930 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
1b940 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
1b950 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
1b960 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
1b970 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
1b980 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
1b990 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
1b9a0 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
1b9b0 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
1b9c0 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
1b9d0 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
1b9e0 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
1b9f0 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
1ba00 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
1ba10 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
1ba20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
1ba30 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
1ba40 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
1ba50 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
1ba60 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
1ba70 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
1ba80 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
1ba90 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
1baa0 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
1bab0 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
1bac0 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
1bad0 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
1bae0 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
1baf0 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
1bb00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1bb10 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
1bb20 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
1bb30 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1bb40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1bb50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1bb60 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1bb70 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1bb80 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1bb90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
1bba0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
1bbb0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1bbc0 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
1bbd0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1bbe0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1bbf0 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
1bc00 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
1bc10 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
1bc20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1bc30 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1bc40 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1bc50 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
1bc60 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
1bc70 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
1bc80 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1bc90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1bca0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1bcb0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1bcc0 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
1bcd0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
1bce0 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
1bcf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
1bd00 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
1bd10 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
1bd20 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
1bd30 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1bd40 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1bd50 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
1bd60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bd70 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
1bd80 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1bd90 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1bda0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1bdb0 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71  CACHE.  {.    sq
1bdc0 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
1bdd0 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f  0;.    /* If ano
1bde0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
1bdf0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
1be00 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
1be10 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
1be20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
1be30 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
1be40 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
1be50 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1be60 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  n is.    ** requ
1be70 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
1be80 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20  LITE_LOCKED..   
1be90 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66   */.    if( (wrf
1bea0 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
1beb0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1bec0 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20  _WRITE).     || 
1bed0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1bee0 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
1bef0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42  .    ){.      pB
1bf00 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
1bf10 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c  ter->db;.    }el
1bf20 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
1bf30 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20  ){.      BtLock 
1bf40 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f  *pIter;.      fo
1bf50 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1bf60 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1bf70 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1bf80 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1bf90 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
1bfa0 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b            pBlock
1bfb0 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
1bfc0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1bfd0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1bfe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bff0 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b     if( pBlock ){
1c000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1c010 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
1c020 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
1c030 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c040 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
1c050 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ACHE;.      goto
1c060 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1c070 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1c080 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
1c090 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
1c0a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
1c0b0 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
1c0c0 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
1c0d0 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
1c0e0 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
1c0f0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
1c100 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
1c110 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
1c120 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c130 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1c140 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
1c150 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1c160 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
1c170 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
1c180 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1c190 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
1c1a0 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
1c1b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1c1c0 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1c1d0 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
1c1e0 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
1c1f0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1c200 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1c210 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
1c220 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
1c230 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
1c240 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
1c250 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
1c260 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
1c270 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
1c280 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1c290 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
1c2a0 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
1c2b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
1c2c0 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1c2d0 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
1c2e0 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
1c2f0 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
1c300 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
1c310 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1c320 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
1c330 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
1c340 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
1c350 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
1c360 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
1c370 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
1c380 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
1c390 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
1c3a0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
1c3b0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
1c3c0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
1c3d0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
1c3e0 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
1c3f0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
1c400 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1c410 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
1c420 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1c430 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1c440 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1c450 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1c460 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
1c470 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1c480 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1c490 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
1c4a0 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
1c4b0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
1c4c0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
1c4d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1c4f0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1c500 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1c520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c530 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
1c540 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1c550 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
1c560 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
1c570 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
1c580 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c590 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1c5a0 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
1c5b0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
1c5c0 6c 65 72 28 70 42 74 29 20 29 3b 0a 20 20 73 71  ler(pBt) );.  sq
1c5d0 6c 69 74 65 33 50 61 67 65 72 52 65 73 65 74 4c  lite3PagerResetL
1c5e0 6f 63 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e  ockTimeout(pBt->
1c5f0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
1c600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c610 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1c620 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1c630 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
1c640 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
1c650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c660 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1c670 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
1c680 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
1c690 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
1c6a0 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
1c6b0 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
1c6c0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1c6d0 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
1c6e0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
1c6f0 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
1c700 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
1c710 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
1c720 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
1c730 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
1c740 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
1c750 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
1c760 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
1c770 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1c780 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
1c790 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
1c7a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c7b0 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
1c7c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
1c7d0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
1c7e0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1c7f0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
1c800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c810 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1c820 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
1c830 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
1c840 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
1c850 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   p;.      pBt->b
1c860 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1c870 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
1c880 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20   if( wrflag>1 ) 
1c890 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1c8a0 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a   BTS_EXCLUSIVE;.
1c8b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
1c8c0 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20   If the db-size 
1c8d0 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20  header field is 
1c8e0 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74  incorrect (as it
1c8f0 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c   may be if an ol
1c900 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e  d.      ** clien
1c910 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69  t has been writi
1c920 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
1c930 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74  file), update it
1c940 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20   now. Doing.    
1c950 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72    ** this sooner
1c960 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
1c970 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  er means the dat
1c980 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73  abase size can s
1c990 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20  afely .      ** 
1c9a0 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61  re-read the data
1c9b0 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70  base size from p
1c9c0 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70  age 1 if a savep
1c9d0 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  oint or transact
1c9e0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  ion.      ** rol
1c9f0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74  lback occurs wit
1ca00 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hin the transact
1ca10 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1ca20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
1ca30 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50  ge!=get4byte(&pP
1ca40 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29  age1->aData[28])
1ca50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ca60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ca70 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1ca80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1ca90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1caa0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1cab0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1cac0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1cad0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
1cae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1caf0 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
1cb00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cb10 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1cb20 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1cb30 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1cb40 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1cb50 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1cb60 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
1cb70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
1cb80 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
1cb90 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
1cba0 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
1cbb0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
1cbc0 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
1cbd0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
1cbe0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1cbf0 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
1cc00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1cc10 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1cc20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
1cc30 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
1cc40 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1cc50 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
1cc60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1cc70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cc80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1cc90 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1cca0 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
1ccb0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
1ccc0 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
1ccd0 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
1cce0 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
1ccf0 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
1cd00 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
1cd10 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1cd20 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
1cd30 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
1cd40 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
1cd50 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
1cd60 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1cd70 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1cd80 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1cd90 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
1cdc0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
1cdd0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ce00 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
1ce10 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ce40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1ce50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ce60 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
1ce70 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
1ce80 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
1ce90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1cea0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1ceb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1cec0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  = pPage->isInit 
1ced0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74  ? SQLITE_OK : bt
1cee0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1cef0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1cf00 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1cf10 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70   rc;.  nCell = p
1cf20 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1cf30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1cf40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
1cf50 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1cf60 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
1cf70 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
1cf80 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1cf90 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
1cfa0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1cfb0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
1cfc0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
1cfd0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
1cfe0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1cff0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1d000 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1d010 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1d020 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1d030 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
1d040 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1d050 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1d060 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1d070 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
1d080 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
1d090 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1d0a0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
1d0b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d0c0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
1d0d0 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70   on pPage is a p
1d0e0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
1d0f0 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  From.  Modify th
1d100 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a  is pointer so.**
1d110 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1d120 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  to iTo. Paramete
1d130 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
1d140 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
1d150 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d  inter to.** be m
1d160 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c  odified, as  fol
1d170 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
1d180 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
1d190 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1d1a0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1d1b0 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
1d1c0 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
1d1d0 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
1d1e0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1d1f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
1d200 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1d210 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1d220 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
1d230 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1d250 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
1d260 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
1d270 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
1d280 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1d290 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
1d2a0 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
1d2b0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1d2c0 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2e0 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
1d2f0 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
1d300 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
1d310 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
1d320 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
1d330 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
1d340 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
1d350 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d360 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1d370 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1d380 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1d390 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
1d3a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
1d3b0 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
1d3c0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1d3d0 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
1d3e0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
1d3f0 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
1d400 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
1d410 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
1d420 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
1d430 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1d440 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
1d450 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d460 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
1d470 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
1d480 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
1d490 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
1d4a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
1d4b0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
1d4c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
1d4d0 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73    rc = pPage->is
1d4e0 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Init ? SQLITE_OK
1d4f0 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   : btreeInitPage
1d500 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
1d510 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1d520 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
1d530 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
1d540 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1d550 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
1d560 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1d570 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
1d580 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1d590 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1d5a0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
1d5b0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
1d5c0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
1d5d0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
1d5e0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
1d5f0 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61    if( info.nLoca
1d600 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  l<info.nPayload 
1d610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1d620 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a   pCell+info.nSiz
1d630 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  e > pPage->aData
1d640 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  +pPage->pBt->usa
1d650 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
1d660 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1d670 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
1d680 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
1d690 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d6a0 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
1d6b0 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1d6c0 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20  Size-4) ){.     
1d6d0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1d6e0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1d6f0 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  -4, iTo);.      
1d700 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d720 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1d730 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
1d740 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
1d750 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
1d760 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
1d770 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1d780 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1d790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d7a0 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
1d7b0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
1d7c0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
1d7d0 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
1d7e0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
1d7f0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1d800 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
1d810 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1d820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d830 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1d840 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d850 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1d860 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1d870 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
1d880 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1d890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d8a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
1d8b0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1d8c0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
1d8d0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
1d8e0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
1d8f0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
1d900 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
1d910 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
1d920 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
1d930 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
1d940 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
1d950 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
1d960 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
1d970 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
1d980 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
1d990 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
1d9a0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
1d9b0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
1d9c0 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
1d9d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
1d9e0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
1d9f0 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
1da00 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1da10 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
1da20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1da30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1da40 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
1da50 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
1da60 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
1da70 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
1da80 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
1da90 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1daa0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
1dab0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1dac0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
1dad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1dae0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
1daf0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
1db00 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1db10 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
1db20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
1db30 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
1db40 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
1db50 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1db60 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
1db70 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
1db80 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1db90 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
1dba0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
1dbb0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1dbc0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
1dbd0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
1dbe0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
1dbf0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
1dc00 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
1dc10 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1dc20 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1dc30 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
1dc40 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1dc50 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1dc60 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
1dc70 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
1dc80 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1dc90 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1dca0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1dcb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1dcc0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1dcd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
1dce0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
1dcf0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
1dd00 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
1dd10 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
1dd20 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
1dd30 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
1dd40 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
1dd50 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
1dd60 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
1dd70 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
1dd80 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
1dd90 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1dda0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
1ddb0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
1ddc0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1ddd0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
1dde0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
1ddf0 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
1de00 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1de10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1de20 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
1de30 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
1de40 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
1de50 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
1de60 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
1de70 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
1de80 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
1de90 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
1dea0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1deb0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
1dec0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
1ded0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
1dee0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
1def0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
1df00 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
1df10 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1df20 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
1df30 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1df40 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
1df50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
1df60 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1df70 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
1df80 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1df90 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
1dfa0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
1dfb0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
1dfc0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
1dfd0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
1dfe0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
1dff0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1e000 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1e010 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1e020 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
1e030 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
1e040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e050 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1e060 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
1e070 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
1e080 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
1e090 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
1e0a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
1e0b0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
1e0c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
1e0d0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
1e0e0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
1e0f0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1e100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e130 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1e140 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
1e150 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
1e160 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
1e170 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
1e180 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
1e190 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
1e1a0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
1e1b0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
1e1c0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
1e1d0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
1e1e0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1e1f0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1e200 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1e210 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
1e220 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
1e230 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1e240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e250 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e260 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1e270 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e280 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
1e290 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e2a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e2b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1e2c0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
1e2d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e2e0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
1e2f0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
1e300 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
1e310 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
1e320 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1e330 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1e340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e350 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
1e360 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
1e370 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
1e380 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1e390 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1e3a0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1e3b0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
1e3c0 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
1e3d0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
1e3e0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1e3f0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
1e400 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
1e410 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
1e420 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
1e430 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
1e440 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
1e450 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
1e460 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1e470 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
1e480 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1e490 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
1e4a0 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
1e4b0 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
1e4c0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
1e4d0 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
1e4e0 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
1e4f0 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
1e500 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
1e510 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1e520 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
1e530 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
1e540 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
1e550 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
1e560 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
1e570 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
1e580 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
1e590 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
1e5a0 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
1e5b0 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
1e5c0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
1e5d0 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
1e5e0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1e5f0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
1e600 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
1e610 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1e620 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
1e630 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1e640 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
1e650 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
1e660 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
1e670 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1e680 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1e690 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
1e6a0 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
1e6b0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
1e6c0 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1e6d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
1e6e0 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
1e6f0 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
1e700 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
1e710 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74  vacuum-on-commit
1e720 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
1e730 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
1e740 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1e750 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
1e760 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
1e770 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1e780 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
1e790 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
1e7a0 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
1e7b0 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
1e7c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e7d0 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
1e7e0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
1e7f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1e800 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1e810 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1e820 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1e830 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
1e840 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
1e850 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1e860 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
1e870 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1e880 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
1e890 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
1e8a0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
1e8b0 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
1e8c0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e8d0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e8e0 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
1e8f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
1e900 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1e910 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1e920 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1e930 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
1e940 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
1e950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1e970 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e980 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1e990 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1e9a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e9b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e9c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1e9d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1e9e0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1e9f0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1ea00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
1ea10 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
1ea20 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
1ea30 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
1ea40 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
1ea50 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
1ea60 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
1ea70 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
1ea80 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
1ea90 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
1eaa0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1eab0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1eac0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
1ead0 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
1eae0 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
1eaf0 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
1eb00 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
1eb10 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
1eb20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1eb30 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
1eb40 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1eb50 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1eb60 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1eb70 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1eb80 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
1eb90 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
1eba0 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
1ebb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ebc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1ebd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1ebe0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1ebf0 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
1ec00 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
1ec10 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1ec20 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1ec30 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
1ec40 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
1ec50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1ec60 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
1ec70 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
1ec80 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
1ec90 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
1eca0 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
1ecb0 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
1ecc0 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
1ecd0 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1ece0 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
1ecf0 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
1ed00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
1ed10 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
1ed20 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1ed30 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
1ed40 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1ed50 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
1ed60 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
1ed70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ed80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ed90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1eda0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1edb0 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
1edc0 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
1edd0 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
1ede0 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
1edf0 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
1ee00 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
1ee10 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
1ee20 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
1ee30 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
1ee40 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
1ee50 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
1ee60 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
1ee70 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1ee80 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
1ee90 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
1eea0 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
1eeb0 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
1eec0 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
1eed0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
1eee0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
1eef0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
1ef00 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1ef10 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
1ef20 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
1ef30 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
1ef40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
1ef50 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
1ef60 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1ef70 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1ef80 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1ef90 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1efa0 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
1efb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1efc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1efd0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1efe0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1eff0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f000 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1f010 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1f020 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1f030 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
1f040 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
1f050 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
1f060 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
1f070 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
1f080 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
1f090 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
1f0a0 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
1f0b0 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
1f0c0 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
1f0d0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1f0e0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1f0f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f100 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f120 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
1f130 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
1f140 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
1f150 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
1f160 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
1f170 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
1f180 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
1f190 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
1f1a0 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
1f1b0 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
1f1c0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
1f1d0 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
1f1e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f1f0 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
1f200 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
1f210 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1f220 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
1f230 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
1f240 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
1f250 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
1f260 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
1f270 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
1f280 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
1f290 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1f2a0 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
1f2b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
1f2c0 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
1f2d0 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
1f2e0 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
1f2f0 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
1f300 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
1f310 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f330 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1f340 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
1f350 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
1f360 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
1f370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f380 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
1f390 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
1f3a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f3d0 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
1f3e0 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
1f3f0 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
1f400 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
1f410 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
1f420 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
1f430 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
1f440 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
1f450 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
1f460 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
1f470 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f480 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
1f490 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f4a0 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1f4b0 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
1f4c0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
1f4d0 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
1f4e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f4f0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1f500 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
1f510 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
1f520 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1f530 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
1f540 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
1f550 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
1f560 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
1f570 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
1f580 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
1f590 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1f5a0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
1f5b0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
1f5c0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
1f5d0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1f5e0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
1f5f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1f600 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
1f610 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
1f620 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1f630 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
1f640 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1f650 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
1f660 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1f670 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
1f680 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
1f690 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1f6a0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1f6b0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1f6c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1f6d0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1f6e0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1f6f0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1f700 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
1f710 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1f720 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
1f730 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1f740 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1f750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1f760 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
1f770 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1f780 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
1f790 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1f7a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1f7b0 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1f7c0 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1f7d0 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1f7e0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
1f7f0 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
1f800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1f810 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1f820 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
1f830 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f840 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1f850 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1f860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f870 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
1f880 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1f890 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1f8a0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1f8b0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1f8c0 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
1f8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f8e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f8f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f900 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f910 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1f920 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f930 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1f940 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1f950 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1f960 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1f970 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1f980 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1f990 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1f9a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f9b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f9c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f9d0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1f9e0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1f9f0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1fa00 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1fa10 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
1fa20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1fa30 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1fa40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fa50 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1fa60 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1fa70 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1fa80 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1fa90 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1faa0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1fab0 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1fac0 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1fad0 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1fae0 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1faf0 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1fb00 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1fb10 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1fb20 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1fb30 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1fb40 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1fb50 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1fb60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fb70 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1fb80 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1fb90 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1fba0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1fbb0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1fbc0 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ; )..  assert( s
1fbd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1fbe0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1fbf0 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1fc00 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1fc10 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1fc20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1fc30 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1fc40 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1fc50 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1fc60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1fc70 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1fc80 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1fc90 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1fca0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1fcb0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1fcc0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1fcd0 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1fce0 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1fcf0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1fd00 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1fd10 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1fd20 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1fd30 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1fd40 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1fd50 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1fd60 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1fd70 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1fd80 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1fd90 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1fda0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fdb0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
1fdc0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1fdd0 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
1fde0 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
1fdf0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
1fe00 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
1fe10 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
1fe20 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
1fe30 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
1fe40 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
1fe50 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1fe60 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
1fe70 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1fe80 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1fe90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1fea0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1feb0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1fec0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1fed0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1fee0 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1fef0 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1ff00 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
1ff10 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
1ff20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ff30 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
1ff40 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
1ff50 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1ff60 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1ff70 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
1ff80 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
1ff90 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
1ffa0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
1ffb0 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
1ffc0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1ffd0 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
1ffe0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1fff0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
20000 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
20010 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
20020 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20030 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20040 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
20050 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
20060 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
20070 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
20080 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
20090 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
200a0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
200b0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
200c0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
200d0 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
200e0 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
200f0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
20100 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
20110 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
20120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20140 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
20150 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
20160 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
20170 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
20180 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
20190 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
201a0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
201b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
201c0 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
201d0 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
201e0 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
201f0 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
20200 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
20210 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
20220 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
20230 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
20240 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
20250 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
20260 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
20270 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
20280 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
20290 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
202a0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
202b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
202c0 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
202d0 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
202e0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
202f0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
20300 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
20310 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
20320 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
20330 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
20340 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
20350 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
20360 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
20370 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
20380 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
20390 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
203a0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
203b0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
203c0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
203d0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
203e0 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
203f0 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
20400 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
20410 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
20420 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
20430 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
20440 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
20450 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
20460 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
20470 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
20480 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
20490 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
204a0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
204b0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
204c0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
204d0 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
204e0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
204f0 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
20500 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
20510 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
20520 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
20530 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
20540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20550 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
20560 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
20570 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
20580 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
20590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
205a0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
205b0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
205c0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
205d0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
205e0 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
205f0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
20600 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
20610 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
20620 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
20630 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
20640 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
20650 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
20660 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
20670 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
20680 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
20690 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
206a0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
206b0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
206c0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
206d0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
206e0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
206f0 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
20700 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
20710 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
20720 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
20730 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
20740 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
20750 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
20760 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
20770 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
20780 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
20790 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
207a0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
207b0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
207c0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
207d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
207e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
207f0 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
20800 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20810 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
20820 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20830 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
20840 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
20850 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
20860 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
20880 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20890 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
208a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
208b0 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
208c0 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
208d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
208e0 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
208f0 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
20900 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
20910 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
20920 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
20930 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
20940 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
20950 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20960 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
20970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20980 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20990 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
209a0 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
209b0 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
209c0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
209d0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
209e0 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
209f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
20a00 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
20a10 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
20a20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
20a30 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
20a40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20a50 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
20a60 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
20a70 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
20a80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20a90 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
20aa0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
20ab0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
20ac0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
20ad0 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
20ae0 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
20af0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
20b00 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
20b10 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
20b20 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
20b30 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
20b40 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
20b50 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
20b60 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
20b70 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
20b80 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
20b90 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
20ba0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
20bb0 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
20bc0 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
20bd0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
20be0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
20bf0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
20c00 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
20c10 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
20c20 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
20c30 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
20c40 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
20c50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
20c60 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
20c70 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
20c80 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
20c90 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
20ca0 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
20cb0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
20cc0 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
20cd0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
20ce0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
20cf0 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
20d00 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
20d10 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
20d20 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
20d30 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
20d40 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
20d50 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
20d60 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
20d70 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
20d80 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
20d90 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
20da0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
20db0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
20dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20dd0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
20de0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
20df0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
20e00 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
20e10 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
20e20 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
20e30 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
20e40 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
20e50 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
20e60 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
20e70 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
20e80 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
20e90 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
20ea0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
20eb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
20ec0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
20ed0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
20ee0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
20ef0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
20f00 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
20f10 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
20f20 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
20f30 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
20f40 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
20f50 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
20f60 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
20f70 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
20f80 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
20f90 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
20fa0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
20fb0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20fc0 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
20fd0 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
20fe0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
20ff0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
21000 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
21010 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
21020 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
21030 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
21040 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
21050 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
21060 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
21070 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
21080 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
21090 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
210a0 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
210b0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
210c0 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
210d0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
210e0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
210f0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
21100 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
21110 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
21120 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
21130 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
21140 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
21150 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
21160 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
21170 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
21180 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
21190 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
211a0 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
211b0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
211c0 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
211d0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
211e0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
211f0 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
21200 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
21210 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
21220 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
21230 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
21240 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
21250 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
21260 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
21270 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
21280 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
21290 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
212a0 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
212b0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
212c0 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
212d0 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
212e0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
212f0 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
21300 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
21310 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
21320 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
21330 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
21340 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
21350 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
21360 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
21370 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
21380 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
21390 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
213a0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
213b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
213c0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
213d0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
213e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
213f0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
21400 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
21410 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
21420 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
21430 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
21440 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21450 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
21460 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
21470 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
21480 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
21490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
214a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
214b0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
214c0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
214d0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
214e0 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
214f0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
21500 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
21510 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
21520 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
21530 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
21540 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
21550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
21560 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21570 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
21580 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
21590 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
215a0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
215b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
215c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
215d0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
215e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
215f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21600 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
21610 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
21620 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
21630 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
21640 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
21650 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
21660 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
21670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
21680 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
21690 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
216a0 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
216b0 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
216c0 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
216d0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
216e0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
216f0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
21700 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
21710 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
21720 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
21730 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
21740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21750 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
21760 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
21770 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
21780 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
21790 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
217a0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
217b0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
217c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
217d0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
217e0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
217f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21810 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
21820 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
21830 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21840 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21850 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
21860 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
21870 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
21880 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
21890 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
218a0 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
218b0 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
218c0 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
218d0 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
218e0 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
218f0 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
21900 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
21910 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
21920 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
21930 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
21940 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
21950 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
21960 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
21970 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
21980 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
21990 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
219a0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
219b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
219c0 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
219d0 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
219e0 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
219f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21a00 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
21a10 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
21a20 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
21a30 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
21a40 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
21a50 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
21a60 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
21a70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
21a80 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
21a90 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
21aa0 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
21ab0 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
21ac0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
21ad0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
21ae0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
21af0 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
21b00 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
21b10 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
21b20 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
21b30 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
21b40 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
21b50 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
21b60 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
21b70 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
21b80 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
21b90 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
21ba0 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
21bb0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
21bc0 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
21bd0 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
21be0 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
21bf0 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
21c00 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
21c10 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
21c20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
21c30 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
21c40 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
21c50 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
21c60 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
21c70 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
21c80 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
21c90 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
21ca0 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
21cb0 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
21cc0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21cd0 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
21ce0 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
21cf0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
21d00 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
21d10 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
21d20 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
21d30 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
21d40 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
21d50 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
21d60 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
21d70 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
21d80 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
21d90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21da0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
21db0 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
21dc0 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
21dd0 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
21de0 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
21df0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
21e00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21e10 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
21e20 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
21e30 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
21e40 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
21e50 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
21e60 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
21e70 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
21e80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21e90 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
21ea0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
21eb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
21ec0 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
21ed0 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
21ee0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
21ef0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
21f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21f10 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
21f20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
21f30 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
21f40 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
21f50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21f70 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
21f80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21f90 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
21fa0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
21fb0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
21fc0 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
21fd0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
21fe0 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
21ff0 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
22000 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
22010 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22020 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
22030 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
22040 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22050 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
22060 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
22070 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ogress..**.** If
22080 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
22090 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
220a0 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
220b0 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69  invalidated (tri
220c0 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77  pped)..** Only w
220d0 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
220e0 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
220f0 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75  eOnly is true bu
22100 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  t all cursors ar
22110 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20  e.** tripped if 
22120 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
22130 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  se.  Any attempt
22140 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69   to use.** a tri
22150 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c  pped cursor will
22160 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
22170 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
22180 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
22190 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
221a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
221b0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
221c0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
221d0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
221e0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
221f0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
22200 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
22210 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
22220 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72  tripCode, int wr
22230 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  iteOnly){.  int 
22240 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
22250 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
22260 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
22270 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74  ..  assert( writ
22280 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74  eOnly==1 || writ
22290 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  eOnly==0 );.  as
222a0 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d  sert( tripCode==
222b0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
222c0 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64  LBACK || tripCod
222d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
222e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
222f0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72  ter(p);.  if( tr
22300 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
22310 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72  K ){.    rc = tr
22320 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c  ipCode = saveAll
22330 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
22340 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
22350 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a   writeOnly = 0;.
22360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
22370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
22380 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20  .  if( tripCode 
22390 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
223a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
223b0 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
223c0 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e  ripCode, writeOn
223d0 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ly);.    assert(
223e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
223f0 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  | (writeOnly==0 
22400 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  && rc2==SQLITE_O
22410 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  K) );.    if( rc
22420 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  2!=SQLITE_OK ) r
22430 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62  c = rc2;.  }.  b
22440 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
22450 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
22460 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
22470 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
22480 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
22490 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
224a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
224b0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
224c0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
224d0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
224e0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
224f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
22500 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
22510 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
22520 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
22530 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
22540 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
22550 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
22560 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
22570 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
22580 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
22590 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
225a0 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
225b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
225c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
225d0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
225e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
225f0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
22600 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
22610 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
22620 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
22630 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
22640 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
22650 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
22660 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
22670 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
22680 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
22690 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
226a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
226b0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
226c0 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
226d0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
226e0 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
226f0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
22700 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  , 1)==0 );.    p
22710 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22720 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
22730 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
22740 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
22750 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
22760 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
22770 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22780 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
22790 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
227a0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
227b0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
227c0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
227d0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
227e0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
227f0 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
22800 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
22810 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
22820 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
22830 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
22840 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
22850 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
22860 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
22870 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
22880 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
22890 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
228a0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
228b0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
228c0 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
228d0 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
228e0 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
228f0 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
22900 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
22910 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
22920 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
22930 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
22940 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
22950 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
22960 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
22970 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
22980 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
22990 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
229a0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
229b0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
229c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
229d0 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
229e0 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
229f0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
22a00 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
22a10 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
22a20 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
22a30 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
22a40 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
22a50 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
22a60 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
22a70 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
22a80 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
22a90 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
22aa0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
22ab0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
22ac0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
22ad0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
22ae0 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
22af0 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
22b00 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
22b10 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
22b20 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
22b30 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
22b40 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
22b50 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
22b60 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
22b70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
22b80 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
22b90 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
22ba0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
22bb0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
22bc0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22bd0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22be0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
22bf0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
22c00 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
22c10 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
22c20 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
22c30 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
22c40 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
22c50 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
22c60 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
22c70 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
22c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
22c90 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
22ca0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
22cb0 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
22cc0 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
22cd0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
22ce0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
22cf0 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
22d00 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
22d10 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
22d20 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
22d30 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
22d40 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
22d50 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
22d60 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
22d70 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
22d80 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
22d90 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
22da0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
22db0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
22dc0 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
22dd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
22de0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
22df0 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
22e00 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
22e10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
22e20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22e30 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
22e40 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
22e50 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
22e60 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
22e70 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
22e80 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
22e90 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
22ea0 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
22eb0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
22ec0 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
22ed0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
22ee0 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
22ef0 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
22f00 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
22f10 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
22f20 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
22f30 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
22f40 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
22f50 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
22f60 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
22f70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
22f80 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
22f90 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
22fa0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
22fb0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
22fc0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
22fd0 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
22fe0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
22ff0 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
23000 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
23010 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
23020 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
23030 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
23040 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
23050 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
23060 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23070 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
23080 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
23090 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
230a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
230b0 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
230c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
230d0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
230e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
230f0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
23100 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
23110 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
23120 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
23130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23140 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
23150 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
23160 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
23170 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
23180 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
23190 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66 28  nter(p);.    if(
231a0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
231b0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
231c0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
231d0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
231e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
231f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23200 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23210 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
23220 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
23230 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
23240 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
23250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23260 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
23270 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
23280 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
23290 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
232a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
232b0 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
232c0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
232d0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
232e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
232f0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
23300 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
23310 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
23320 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
23330 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
23340 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
23350 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
23360 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
23370 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
23380 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
23390 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
233a0 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
233b0 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
233c0 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
233d0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
233e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
233f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23400 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
23410 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
23420 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
23430 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
23440 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
23450 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
23460 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
23470 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
23480 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
23490 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
234a0 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
234b0 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
234c0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
234d0 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
234e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
234f0 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
23500 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
23510 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
23520 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
23530 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
23540 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
23550 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
23560 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53  f the BTREE_WRCS
23570 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  R bit of wrFlag 
23580 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74  is clear, then t
23590 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
235a0 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f  ly.** be used fo
235b0 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74  r reading.  If t
235c0 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
235d0 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  it is set, then 
235e0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
235f0 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
23600 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69  ading or for wri
23610 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
23620 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
23630 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  ting.** are also
23640 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65   met.  These are
23650 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
23660 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
23670 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72   in order.** for
23680 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61   writing to be a
23690 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
236a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
236b0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
236c0 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63  ed with wrFlag c
236d0 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f  ontaining BTREE_
236e0 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  WRCSR.**.** 2:  
236f0 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
23700 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
23710 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
23720 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
23730 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
23740 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
23750 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
23760 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
23770 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
23780 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
23790 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
237a0 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
237b0 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
237c0 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
237d0 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
237e0 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
237f0 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
23800 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
23810 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
23820 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
23830 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
23840 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
23850 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
23860 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
23870 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
23880 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
23890 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
238a0 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45   The BTREE_FORDE
238b0 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c  LETE bit of wrFl
238c0 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c  ag may optionall
238d0 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45  y be set if BTRE
238e0 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65  E_WRCSR.** is se
238f0 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45  t.  If FORDELETE
23900 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73   is set, that is
23910 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69   a hint to the i
23920 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
23930 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f  at.** this curso
23940 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75  r will only be u
23950 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61  sed to seek to a
23960 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65  nd delete entrie
23970 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  s of an index.**
23980 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61   as part of a la
23990 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74  rger DELETE stat
239a0 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44  ement.  The FORD
239b0 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f  ELETE hint is no
239c0 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69  t used by.** thi
239d0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
239e0 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f  .  But in a hypo
239f0 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61  thetical alterna
23a00 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67  tive storage eng
23a10 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68  ine .** in which
23a20 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
23a30 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
23a40 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f   deleted when co
23a50 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
23a60 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65  e.** rows are de
23a70 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45  leted, the FORDE
23a80 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68  LETE flag is a h
23a90 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45  int that all SEE
23aa0 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20  K and DELETE.** 
23ab0 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68  operations on th
23ac0 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  is cursor can be
23ad0 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20   no-ops and all 
23ae0 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20  READ operations 
23af0 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  can .** return a
23b00 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74   null row (2-byt
23b10 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a  es: 0x01 0x00)..
23b20 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
23b30 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
23b40 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
23b50 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
23b60 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
23b70 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
23b80 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
23b90 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
23ba0 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
23bb0 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
23bc0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
23bd0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
23be0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23bf0 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
23c00 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
23c10 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
23c20 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
23c30 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
23c40 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
23c50 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
23c60 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
23c70 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
23ca0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
23cb0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cd0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
23ce0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
23cf0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
23d20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
23d30 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
23d40 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
23d50 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
23d60 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
23d70 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
23d80 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
23d90 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23db0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
23dc0 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
23dd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
23de0 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
23df0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
23e00 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
23e10 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
23e20 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e40 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68  Looping over oth
23e50 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a  er all cursors *
23e60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
23e70 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
23e80 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
23e90 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20  rt( wrFlag==0 . 
23ea0 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
23eb0 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20  =BTREE_WRCSR .  
23ec0 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
23ed0 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52  (BTREE_WRCSR|BTR
23ee0 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20  EE_FORDELETE) . 
23ef0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
23f00 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
23f10 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
23f20 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
23f30 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
23f40 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
23f50 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
23f60 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
23f70 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
23f80 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
23f90 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
23fa0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
23fb0 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
23fc0 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
23fd0 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
23fe0 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
23ff0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
24000 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
24010 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
24020 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29   (wrFlag?2:1)) )
24030 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24040 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
24050 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
24060 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
24070 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
24080 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
24090 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
240a0 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
240b0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
240c0 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
240d0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
240e0 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
240f0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
24100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
24110 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
24120 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
24130 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24140 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62  ag==0 || (pBt->b
24150 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
24160 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a  AD_ONLY)==0 );..
24170 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a    if( wrFlag ){.
24180 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
24190 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
241a0 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
241b0 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
241c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
241d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
241e0 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
241f0 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
24200 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
24210 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
24220 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
24230 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
24240 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
24250 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
24260 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
24270 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
24280 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
24290 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
242a0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
242b0 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
242c0 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
242d0 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
242e0 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
242f0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
24300 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
24310 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
24320 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
24330 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
24340 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43  s = wrFlag ? BTC
24350 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b  F_WriteFlag : 0;
24360 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  .  pCur->curPage
24370 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
24380 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f  ? 0 : PAGER_GET_
24390 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49  READONLY;.  /* I
243a0 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
243b0 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
243c0 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
243d0 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
243e0 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d  .  ** cursors *m
243f0 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54  ust* have the BT
24400 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
24410 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70   set. */.  for(p
24420 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  X=pBt->pCursor; 
24430 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
24440 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70  ){.    if( pX->p
24450 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69  gnoRoot==(Pgno)i
24460 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  Table ){.      p
24470 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  X->curFlags |= B
24480 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
24490 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
244a0 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
244b0 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ple;.    }.  }. 
244c0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
244d0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70  Bt->pCursor;.  p
244e0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
244f0 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
24500 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
24510 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  LID;.  return SQ
24520 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
24530 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
24540 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24570 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
24580 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245b0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
245c0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
245d0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24600 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
24610 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
24620 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
24630 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
24640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
24650 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
24660 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
24670 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24690 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
246a0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
246b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
246c0 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b   if( iTable<1 ){
246d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
246e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
246f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
24700 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
24710 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
24720 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
24730 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
24740 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73  fo, pCur);.    s
24750 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
24760 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
24770 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
24780 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
24790 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
247a0 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
247b0 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
247c0 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
247d0 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
247e0 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
247f0 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
24800 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
24810 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
24820 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
24830 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
24840 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
24850 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
24860 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
24870 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
24880 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
24890 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
248a0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
248b0 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
248c0 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
248d0 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
248e0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
248f0 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
24900 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
24910 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
24920 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
24930 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
24940 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
24950 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
24960 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
24970 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
24980 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
24990 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
249a0 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
249b0 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
249c0 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
249d0 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
249e0 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
249f0 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
24a00 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
24a10 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
24a20 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
24a30 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
24a40 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
24a50 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
24a60 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
24a70 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
24a80 72 73 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f 46  rsor, BTCURSOR_F
24a90 49 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d  IRST_UNINIT));.}
24aa0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
24ab0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
24ac0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
24ad0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
24ae0 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
24af0 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
24b00 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
24b10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
24b20 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
24b30 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
24b40 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
24b50 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
24b60 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42   pBtree ){.    B
24b70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
24b80 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
24b90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
24ba0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
24bb0 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
24bc0 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
24bd0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43  pBt->pCursor==pC
24be0 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ur ){.      pBt-
24bf0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
24c00 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
24c10 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f  e{.      BtCurso
24c20 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e  r *pPrev = pBt->
24c30 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64  pCursor;.      d
24c40 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
24c50 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75  Prev->pNext==pCu
24c60 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
24c70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
24c80 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ur->pNext;.     
24c90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
24cb0 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65  rev = pPrev->pNe
24cc0 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  xt;.      }while
24cd0 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20  ( ALWAYS(pPrev) 
24ce0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  );.    }.    btr
24cf0 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
24d00 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
24d10 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
24d20 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
24d30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
24d40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
24d50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24d60 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
24d70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
24d80 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
24d90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24da0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
24db0 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
24dc0 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
24dd0 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
24de0 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
24df0 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
24e00 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
24e10 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
24e20 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
24e30 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
24e40 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
24e50 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
24e60 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
24e70 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
24e80 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
24e90 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
24ea0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
24eb0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
24ec0 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
24ed0 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  l()..*/.#ifndef 
24ee0 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
24ef0 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61  int cellInfoEqua
24f00 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43  l(CellInfo *a, C
24f10 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20  ellInfo *b){.   
24f20 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d   if( a->nKey!=b-
24f30 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30  >nKey ) return 0
24f40 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61  ;.    if( a->pPa
24f50 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f  yload!=b->pPaylo
24f60 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ad ) return 0;. 
24f70 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f     if( a->nPaylo
24f80 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20  ad!=b->nPayload 
24f90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
24fa0 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62  if( a->nLocal!=b
24fb0 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72  ->nLocal ) retur
24fc0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e  n 0;.    if( a->
24fd0 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20  nSize!=b->nSize 
24fe0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
24ff0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
25000 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25010 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
25020 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
25030 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
25040 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
25050 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
25060 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
25070 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
25080 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e  e, pCur->ix, &in
25090 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
250a0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63   CORRUPT_DB || c
250b0 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e  ellInfoEqual(&in
250c0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  fo, &pCur->info)
250d0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
250e0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
250f0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
25100 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
25110 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
25120 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
25130 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
25140 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
25150 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
25160 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
25170 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
25180 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
25190 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72  pCur->pPage,pCur
251a0 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  ->ix,&pCur->info
251b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
251c0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
251d0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
251e0 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
251f0 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
25200 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
25210 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
25220 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
25230 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
25240 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
25250 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
25260 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
25270 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
25280 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
25290 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
252a0 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
252b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
252c0 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
252d0 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
252e0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
252f0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
25300 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
25310 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
25320 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25330 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
25340 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25350 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
25360 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
25370 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25380 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e  eCursorIsValidNN
25390 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
253a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  {.  assert( pCur
253b0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
253c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
253d0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  RSOR_VALID;.}../
253e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
253f0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
25400 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77  eger key or "row
25410 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20  id" for a table 
25420 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72  btree..** This r
25430 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76  outine is only v
25440 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f  alid for a curso
25450 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
25460 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64  ng into a.** ord
25470 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65  inary table btre
25480 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
25490 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69  r points to an i
254a0 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a  ndex btree or.**
254b0 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   is invalid, the
254c0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
254d0 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66  routine is undef
254e0 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  ined..*/.i64 sql
254f0 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
25500 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
25510 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
25520 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25530 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25540 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25550 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25560 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25570 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
25580 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
25590 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
255a0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a  ->info.nKey;.}..
255b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
255c0 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
255d0 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  FUNC./*.** Retur
255e0 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  n the offset int
255f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
25600 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ile for the star
25610 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c  t of the.** payl
25620 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74 68 65  oad to which the
25630 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
25640 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ing..*/.i64 sqli
25650 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 42  te3BtreeOffset(B
25660 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25670 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25680 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
256a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
256b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
256c0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
256d0 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 70  .  return (i64)p
256e0 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  Cur->pBt->pageSi
256f0 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70  ze*((i64)pCur->p
25700 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20  Page->pgno - 1) 
25710 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36 34 29  +.         (i64)
25720 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  (pCur->info.pPay
25730 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61  load - pCur->pPa
25740 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65  ge->aData);.}.#e
25750 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
25760 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
25770 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _FUNC */../*.** 
25780 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
25790 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
257a0 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
257b0 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
257c0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
257d0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
257e0 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
257f0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
25800 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
25810 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
25820 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
25830 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
25840 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
25850 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
25860 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
25870 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25880 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
25890 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
258a0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
258b0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
258c0 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
258d0 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
258e0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
258f0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
25900 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
25910 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
25920 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
25930 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
25940 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25950 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25960 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25970 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25980 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
25990 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
259a0 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
259b0 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
259c0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
259d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
259e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
259f0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
25a00 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
25a10 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
25a20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
25a30 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
25a40 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
25a50 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
25a60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
25a70 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
25a80 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
25a90 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
25aa0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
25ab0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
25ac0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
25ad0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
25ae0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
25af0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
25b00 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
25b10 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
25b20 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
25b30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25b40 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
25b50 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
25b60 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
25b70 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
25b80 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
25b90 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
25ba0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
25bb0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
25bc0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
25bd0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
25be0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
25bf0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
25c00 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
25c10 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
25c20 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
25c30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
25c40 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
25c50 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
25c60 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
25c70 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
25c80 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
25c90 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
25ca0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
25cb0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
25cc0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
25cd0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
25ce0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
25cf0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
25d00 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
25d10 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
25d20 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
25d30 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
25d40 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
25d50 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
25d60 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
25d70 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
25d80 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
25d90 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
25da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25db0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25dc0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25de0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
25df0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
25e00 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
25e10 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
25e20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
25e30 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
25e40 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
25e50 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
25e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25e70 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
25e80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
25e90 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
25ea0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
25eb0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
25ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25ed0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25ee0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
25ef0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
25f00 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
25f10 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
25f20 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
25f30 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
25f40 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
25f50 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
25f60 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
25f70 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
25f80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
25f90 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
25fa0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
25fb0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
25fc0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
25fd0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
25fe0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
25ff0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
26000 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
26010 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
26020 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
26030 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
26040 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
26050 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
26060 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
26070 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26080 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
26090 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
260a0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
260b0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
260c0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
260d0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
260e0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
260f0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26100 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
26110 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
26120 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
26130 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
26140 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
26150 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
26160 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
26170 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
26180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26190 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
261a0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
261b0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
261c0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
261d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
261e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
261f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
26200 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
26210 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
26220 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
26230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26240 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
26250 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
26260 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
26270 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
26280 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
26290 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
262a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
262b0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
262c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
262d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
262e0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
262f0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
26300 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
26310 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
26320 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
26330 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
26340 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
26350 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
26360 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
26370 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
26380 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
26390 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
263a0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
263b0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
263c0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
263d0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
263e0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
263f0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
26400 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
26410 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
26420 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
26430 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
26440 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
26450 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
26460 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
26470 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
26480 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
26490 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
264a0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
264b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
264c0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
264d0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
264e0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
264f0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
26500 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
26510 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
26520 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
26530 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
26540 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
26550 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
26560 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
26570 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
26580 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
26590 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
265a0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
265b0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
265c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
265d0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
265e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
26610 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
26620 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
26630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
26640 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
26650 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
26660 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
26670 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
26680 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
26690 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
266a0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
266b0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
266c0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
266d0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
266e0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
266f0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
26700 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
26710 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
26720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26730 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26740 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
26750 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
26760 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
26770 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
26780 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
26790 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
267a0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
267b0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
267c0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
267d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
267e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
267f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26800 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
26810 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
26820 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
26830 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
26840 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
26850 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
26860 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
26870 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
26880 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
26890 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
268a0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
268b0 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
268c0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
268d0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
268e0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
268f0 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
26900 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
26910 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
26920 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
26930 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
26940 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
26950 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
26960 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
26970 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
26980 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
26990 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
269a0 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
269b0 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
269c0 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
269d0 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
269e0 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
269f0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
26a00 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
26a10 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
26a20 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
26a30 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
26a40 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ages.** this fun
26a50 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
26a60 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
26a70 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
26a80 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  .** the overflow
26a90 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26aa0 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
26ab0 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
26ac0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
26ad0 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
26ae0 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
26af0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
26b00 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
26b10 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
26b20 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
26b30 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
26b40 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
26b50 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62  cated, it must b
26b60 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
26b70 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
26b80 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
26b90 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
26ba0 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
26bb0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
26bc0 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
26bd0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
26be0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
26bf0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
26c00 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
26c10 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
26c20 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
26c30 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
26c40 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
26c50 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
26c60 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
26c70 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
26c80 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
26c90 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
26ca0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
26cb0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26cc0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
26cd0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
26ce0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
26cf0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
26d00 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
26d10 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
26d20 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
26d30 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
26d40 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
26d50 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
26d60 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
26d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26d80 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
26d90 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
26da0 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
26db0 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
26dc0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
26dd0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26df0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
26e00 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
26e10 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
26e20 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
26e30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26e40 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
26e50 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
26e60 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
26e70 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >pPage;         
26e80 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70        /* Btree p
26e90 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
26ea0 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
26eb0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
26ec0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
26ed0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
26ee0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
26ef0 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
26f00 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26f10 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
26f20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
26f30 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
26f40 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61  pBuf;     /* Sta
26f50 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f  rt of original o
26f60 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e  ut buffer */.#en
26f70 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
26f80 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
26f90 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d  ( eOp==0 || eOp=
26fa0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
26fb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26fc0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26fd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
26fe0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
26ff0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27000 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27010 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
27020 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
27030 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
27040 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61  fo.pPayload;.  a
27050 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
27060 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
27070 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61  nPayload );..  a
27080 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20  ssert( aPayload 
27090 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  > pPage->aData )
270a0 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61  ;.  if( (uptr)(a
270b0 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d  Payload - pPage-
270c0 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e  >aData) > (pBt->
270d0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75  usableSize - pCu
270e0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  r->info.nLocal) 
270f0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
27100 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
27110 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
27120 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
27130 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20   error.  The.   
27140 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   ** conditional 
27150 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a  above is really:
27160 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79  .    **    &aPay
27170 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
27180 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
27190 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
271a0 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20  bleSize].    ** 
271b0 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e  but is recast in
271c0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66  to its current f
271d0 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74  orm to avoid int
271e0 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72  eger overflow pr
271f0 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20  oblems.    */.  
27200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27210 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
27220 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ge);.  }..  /* C
27230 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
27240 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
27250 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
27260 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
27270 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
27280 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
27290 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
272a0 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
272b0 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
272c0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
272d0 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
272e0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
272f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
27300 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
27310 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
27320 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
27330 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
27340 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
27350 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
27360 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
27370 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
27380 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
27390 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
273a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
273b0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
273c0 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
273d0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
273e0 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
273f0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
27400 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
27410 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
27420 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
27430 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
27440 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
27450 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
27460 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
27470 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
27480 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
27490 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
274a0 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   now..    **.   
274b0 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
274c0 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
274d0 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
274e0 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
274f0 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
27500 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
27510 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
27520 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
27530 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
27540 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
27550 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
27560 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
27570 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
27580 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
27590 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
275a0 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
275b0 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
275c0 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
275d0 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
275e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
275f0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
27600 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
27610 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
27620 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
27630 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
27640 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
27650 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
27660 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20  >aOverflow==0.  
27670 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69       || nOvfl*(i
27680 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  nt)sizeof(Pgno) 
27690 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  > sqlite3MallocS
276a0 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ize(pCur->aOverf
276b0 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  low).      ){.  
276c0 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
276d0 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
276e0 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
276f0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
27700 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
27710 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
27720 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
27730 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
27740 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
27750 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
27760 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
27770 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
27780 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
27790 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
277a0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
277b0 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
277c0 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
277d0 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
277e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
277f0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  |= BTCF_ValidOvf
27800 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
27810 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
27820 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27830 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
27840 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
27850 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79  e.      ** entry
27860 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
27870 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
27880 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
27890 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69  skip.      ** di
278a0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
278b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
278c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
278d0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
278e0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64  ] ){.        iId
278f0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
27900 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Size);.        n
27910 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
27920 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
27930 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
27940 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
27950 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
27960 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
27970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27980 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68   amt>0 );.    wh
27990 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b  ile( nextPage ){
279a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
279b0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
279c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
279d0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
279e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
279f0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
27a00 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
27a10 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61        || pCur->a
27a20 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
27a30 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20  nextPage.       
27a40 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
27a50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43  T_DB );.      pC
27a60 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
27a70 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
27a80 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
27a90 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
27aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
27ab0 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
27ac0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
27ad0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
27ae0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
27af0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
27b00 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
27b10 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
27b20 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27b30 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
27b40 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
27b50 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
27b60 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
27b70 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
27b80 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
27b90 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
27ba0 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
27bb0 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
27bc0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
27bd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
27be0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
27bf0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
27c00 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
27c10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27c20 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
27c30 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
27c40 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
27c50 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
27c60 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
27c70 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
27c80 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
27c90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27ca0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
27cb0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
27cc0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
27cd0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
27ce0 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
27cf0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
27d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27d10 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
27d20 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
27d30 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
27d40 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
27d50 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
27d60 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
27d70 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
27d80 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
27d90 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
27da0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
27db0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
27dc0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
27dd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
27de0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72        /* File fr
27df0 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64  om which to do d
27e00 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72  irect overflow r
27e10 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
27e20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
27e30 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
27e40 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
27e50 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
27e60 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
27e70 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
27e80 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
27e90 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
27ea0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
27eb0 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
27ec0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
27ed0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27ee0 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
27ef0 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
27f00 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
27f10 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
27f20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
27f30 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
27f40 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
27f50 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
27f60 20 20 20 33 29 20 74 68 65 72 65 20 69 73 20 6e     3) there is n
27f70 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61  o open write-tra
27f80 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
27f90 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
27fa0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
27fb0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
27fc0 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
27fd0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
27fe0 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20  n the WAL file. 
27ff0 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
28000 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
28010 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
28020 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  n read into the 
28030 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20  output buffer . 
28040 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28050 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
28060 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
28070 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
28080 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
28090 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
280a0 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
280b0 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
280c0 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
280d0 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
280e0 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
280f0 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
28100 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
28110 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
28120 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28130 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
28170 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
28180 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
281c0 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
281d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
281e0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28200 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
28210 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
28220 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
28230 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
28240 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f  ds     /* (4) */
28250 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
28260 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57  sqlite3PagerUseW
28270 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
28280 6e 65 78 74 50 61 67 65 29 20 20 20 20 20 20 20  nextPage)       
28290 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
282a0 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
282b0 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
282e0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
282f0 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
28300 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
28310 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
28320 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
28330 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
28340 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20        /* due to 
28370 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
28380 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
28390 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
283a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
283b0 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
283c0 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
283d0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
283e0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
283f0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
28400 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
28410 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
28420 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
28430 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
28440 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
28450 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
28460 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
28470 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28480 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
28490 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
284a0 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
284b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
284c0 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  eOp==0 ? PAGER_G
284d0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
284e0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
284f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
28500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28510 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
28520 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
28530 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
28540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
28550 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
28560 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
28570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
28580 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
28590 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
285a0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
285b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
285c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
285d0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
285e0 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
285f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
28600 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28610 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
28620 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d         if( amt==
28630 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
28640 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
28650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28660 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
28670 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20        iIdx++;.  
28680 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
28690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
286a0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  amt>0 ){.    /* 
286b0 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65  Overflow chain e
286c0 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20  nds prematurely 
286d0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
286e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
286f0 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
28700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28710 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
28720 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
28730 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
28740 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
28750 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
28760 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
28770 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
28780 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
28790 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
287a0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
287b0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
287c0 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
287d0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
287e0 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
287f0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
28800 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
28810 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
28820 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
28830 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
28840 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
28850 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
28860 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
28870 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
28880 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
28890 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
288a0 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
288b0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
288c0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
288d0 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
288e0 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
288f0 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
28900 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28910 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
28920 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
28930 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
28940 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
28950 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
28960 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
28970 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
28980 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
28990 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
289a0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
289b0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
289c0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
289d0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
289e0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
289f0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
28a00 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
28a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28a20 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
28a30 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
28a40 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
28a50 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
28a60 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28a70 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
28a80 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28a90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28ab0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
28ac0 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
28ad0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
28ae0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
28af0 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
28b00 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
28b10 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
28b20 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
28b30 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
28b40 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74  .** This variant
28b50 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
28b60 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20  Payload() works 
28b70 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73  even if the curs
28b80 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e  or has not.** in
28b90 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49   the CURSOR_VALI
28ba0 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20  D state.  It is 
28bb0 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
28bc0 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
28bd0 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ad().** interfac
28be0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
28bf0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
28c00 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  OB.static SQLITE
28c10 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63  _NOINLINE int ac
28c20 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
28c30 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
28c40 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73  pCur,.  u32 offs
28c50 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20  et,.  u32 amt,. 
28c60 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20   void *pBuf.){. 
28c70 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20   int rc;.  if ( 
28c80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28c90 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
28ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28cb0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61  E_ABORT;.  }.  a
28cc0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28cd0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28ce0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52  );.  rc = btreeR
28cf0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
28d00 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65  tion(pCur);.  re
28d10 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61  turn rc ? rc : a
28d20 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
28d30 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
28d40 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  pBuf, 0);.}.int 
28d50 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28d60 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72  oadChecked(BtCur
28d70 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
28d80 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
28d90 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
28da0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
28db0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
28dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72  .    assert( cur
28dd0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
28de0 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74  pCur) );.    ret
28df0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
28e00 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
28e10 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
28e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
28e30 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
28e40 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66  Checked(pCur, of
28e50 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29  fset, amt, pBuf)
28e60 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
28e70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
28e80 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
28e90 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
28ea0 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
28eb0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
28ec0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
28ed0 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
28ee0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
28ef0 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
28f00 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
28f10 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
28f20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20  if index btrees 
28f30 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
28f40 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61  0) and is the da
28f50 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20  ta for.** table 
28f60 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
28f70 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e  ntKey==1). The n
28f80 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
28f90 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b  f available.** k
28fa0 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
28fb0 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  en into *pAmt.  
28fc0 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
28fd0 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72  n the value.** r
28fe0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
28ff0 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   be a valid poin
29000 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
29010 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
29020 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
29030 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
29040 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
29050 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
29060 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
29070 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
29080 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
29090 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
290a0 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
290b0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
290c0 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
290d0 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
290e0 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
290f0 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
29100 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
29110 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
29120 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
29130 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
29140 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
29150 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
29160 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
29170 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
29180 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
29190 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
291a0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
291b0 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
291c0 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
291d0 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
291e0 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
291f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
29200 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
29210 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
29220 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
29230 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
29240 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
29250 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20  atic const void 
29260 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
29270 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
29280 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
29290 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
292a0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
292b0 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20  /.  u32 *pAmt   
292c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
292d0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
292e0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
292f0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
29300 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20   amt;.  assert( 
29310 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
29320 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
29330 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73 73  r->pPage);.  ass
29340 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29350 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
29370 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
29380 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
29390 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
293a0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
293b0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
293c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
293d0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
293e0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
293f0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29400 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
29410 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29420 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70  pPayload>pCur->p
29430 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43  Page->aData || C
29440 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
29450 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29460 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
29470 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
29480 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
29490 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e    amt = pCur->in
294a0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28  fo.nLocal;.  if(
294b0 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72 2d   amt>(int)(pCur-
294c0 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
294d0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
294e0 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f  ayload) ){.    /
294f0 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20 6c  * There is too l
29500 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20 74  ittle space on t
29510 68 65 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  he page for the 
29520 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a  expected amount.
29530 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20      ** of local 
29540 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61 73  content. Databas
29550 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
29560 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
29570 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  ( CORRUPT_DB );.
29580 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c      amt = MAX(0,
29590 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61   (int)(pCur->pPa
295a0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  ge->aDataEnd - p
295b0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
295c0 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d  ad));.  }.  *pAm
295d0 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20 20  t = (u32)amt;.  
295e0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
295f0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
29600 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
29610 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
29620 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
29630 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
29640 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
29650 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
29660 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
29670 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
29680 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
29690 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
296a0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
296b0 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
296c0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
296d0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
296e0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
296f0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
29700 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
29710 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
29720 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
29730 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
29740 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
29750 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
29760 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
29770 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
29780 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
29790 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
297a0 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
297b0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
297c0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
297d0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
297e0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
297f0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
29800 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
29810 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
29820 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
29830 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
29840 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
29850 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
29860 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42  eePayloadFetch(B
29870 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
29880 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
29890 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
298a0 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
298b0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
298c0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
298d0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
298e0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
298f0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
29900 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
29910 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
29920 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
29930 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
29940 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
29950 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
29960 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
29970 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
29980 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
29990 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
299a0 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
299b0 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
299c0 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
299d0 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
299e0 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
299f0 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
29a00 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
29a10 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
29a20 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
29a30 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
29a40 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
29a50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
29a60 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
29a70 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29a80 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29a90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29aa0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29ab0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
29ac0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
29ad0 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
29ae0 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
29af0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
29b00 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
29b10 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
29b20 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
29b30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29b40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29b50 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
29b60 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29b70 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29b80 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
29b90 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
29ba0 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  l);.  pCur->aiId
29bb0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29bc0 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75   pCur->ix;.  pCu
29bd0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29be0 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70  iPage] = pCur->p
29bf0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78  Page;.  pCur->ix
29c00 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
29c10 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  age++;.  return 
29c20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
29c30 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
29c40 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2c  ur->pPage, pCur,
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 7d 0a 0a 23 69 66 64 65 66  lags);.}..#ifdef
29c70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
29c80 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
29c90 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
29ca0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
29cb0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
29cc0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
29cd0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
29ce0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
29cf0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
29d00 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
29d10 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
29d20 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
29d30 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
29d40 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
29d50 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
29d60 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
29d70 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
29d80 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
29d90 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
29da0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
29db0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
29dc0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
29dd0 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
29de0 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
29df0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
29e00 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
29e10 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
29e20 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
29e30 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
29e60 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
29e70 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
29e80 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
29e90 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
29ea0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
29eb0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
29ec0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
29ed0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
29ee0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
29ef0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
29f00 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
29f10 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
29f20 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
29f30 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
29f40 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
29f50 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
29f60 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
29f70 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
29f80 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
29f90 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
29fa0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
29fb0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
29fc0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
29fd0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
29fe0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
29ff0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
2a000 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
2a010 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
2a020 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
2a030 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
2a040 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
2a050 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
2a060 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
2a070 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
2a080 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
2a090 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
2a0a0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2a0b0 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28  pLeaf;.  assert(
2a0c0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a0d0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a0e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a0f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a100 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2a110 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
2a120 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a130 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
2a140 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
2a150 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2a160 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
2a170 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2a180 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2a190 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
2a1a0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
2a1b0 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
2a1c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2a1d0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
2a1e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
2a1f0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
2a200 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2a210 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2a220 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2a230 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2a240 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
2a250 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  >ix = pCur->aiId
2a260 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2a270 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72  ;.  pLeaf = pCur
2a280 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  ->pPage;.  pCur-
2a290 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
2a2a0 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50  pPage[--pCur->iP
2a2b0 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50  age];.  releaseP
2a2c0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66  ageNotNull(pLeaf
2a2d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
2a2e0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
2a2f0 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
2a300 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
2a310 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
2a320 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
2a330 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
2a340 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
2a350 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
2a360 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
2a370 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
2a380 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
2a390 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
2a3a0 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
2a3b0 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
2a3c0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
2a3d0 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
2a3e0 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
2a3f0 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
2a400 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
2a410 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
2a420 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
2a430 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
2a440 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
2a450 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
2a460 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
2a470 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
2a480 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
2a490 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
2a4a0 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  D and this routi
2a4b0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
2a4c0 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69  E_EMPTY. Otherwi
2a4d0 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  se,.** the curso
2a4e0 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
2a4f0 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  t to the first c
2a500 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
2a510 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76  he root.** (or v
2a520 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
2a530 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
2a540 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2a550 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
2a560 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
2a570 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
2a580 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
2a590 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
2a5a0 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
2a5b0 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
2a5c0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
2a5d0 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
2a5e0 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
2a5f0 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
2a600 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
2a610 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
2a620 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
2a630 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
2a640 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
2a650 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
2a660 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
2a670 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
2a680 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
2a690 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
2a6a0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
2a6b0 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
2a6c0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
2a6d0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
2a6e0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
2a6f0 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
2a700 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
2a710 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
2a720 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2a730 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
2a740 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2a750 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
2a760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a770 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a780 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2a790 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a7a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
2a7b0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2a7c0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2a7d0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
2a7e0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2a7f0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2a800 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
2a810 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
2a820 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2a830 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2a840 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2a850 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69  ESEEK || pCur->i
2a860 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65  Page<0 );.  asse
2a870 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2a880 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  ot>0 || pCur->iP
2a890 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20  age<0 );..  if( 
2a8a0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2a8b0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2a8c0 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72  iPage ){.      r
2a8d0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
2a8e0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  l(pCur->pPage);.
2a8f0 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70        while( --p
2a900 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
2a910 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2a920 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
2a930 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a940 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e]);.      }.   
2a950 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
2a960 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2a970 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69  ;.      goto ski
2a980 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20  p_init;.    }.  
2a990 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
2a9a0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
2a9b0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2a9c0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2a9d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2a9e0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c  ITE_EMPTY;.  }el
2a9f0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2aa00 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31  pCur->iPage==(-1
2aa10 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ) );.    if( pCu
2aa20 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
2aa30 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
2aa40 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2aa50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2aa60 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20  FAULT ){.       
2aa70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2aa80 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
2aa90 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  OK );.        re
2aaa0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
2aab0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
2aac0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
2aad0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
2aae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2aaf0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2ab00 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2ab10 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2ab20 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c  t, &pCur->pPage,
2ab30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ab40 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72           0, pCur
2ab50 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
2ab60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ab70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ab80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2ab90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2aba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2abb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
2abc0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >iPage = 0;.    
2abd0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2abe0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  = pCur->pPage->i
2abf0 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
2ac00 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
2ac10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
2ac20 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
2ac30 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
2ac40 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
2ac50 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
2ac60 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
2ac70 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
2ac80 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
2ac90 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
2aca0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
2acb0 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
2acc0 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
2acd0 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
2ace0 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
2acf0 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
2ad00 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2ad10 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
2ad20 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
2ad30 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
2ad40 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
2ad50 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2ad60 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2ad70 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
2ad80 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
2ad90 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
2ada0 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
2adb0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2adc0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
2add0 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
2ade0 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
2adf0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
2ae00 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2ae10 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
2ae20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
2ae30 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
2ae40 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
2ae50 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
2ae60 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
2ae70 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
2ae80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
2ae90 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
2aea0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2aeb0 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
2aec0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
2aed0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2aee0 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
2aef0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
2af00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2af10 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29  AGE(pCur->pPage)
2af20 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74  ;.  }..skip_init
2af30 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  :  .  pCur->ix =
2af40 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
2af50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2af60 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2af70 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2af80 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2af90 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
2afa0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2afb0 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
2afc0 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
2afd0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2afe0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2aff0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
2b000 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
2b010 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
2b020 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
2b030 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
2b040 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2b050 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
2b060 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
2b070 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
2b080 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2b090 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2b0a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2b0b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2b0c0 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
2b0d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b0e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2b0f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2b100 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2b110 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  MPTY;.  }.  retu
2b120 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b130 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2b140 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
2b150 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2b160 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2b170 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
2b180 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2b190 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
2b1a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2b1b0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
2b1c0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
2b1d0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
2b1e0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2b1f0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2b200 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2b210 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2b220 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2b230 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b240 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2b250 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2b260 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2b270 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2b280 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b290 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2b2a0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2b2b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b2c0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2b2d0 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
2b2e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2b2f0 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
2b300 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
2b310 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2b320 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2b330 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >ix));.    rc = 
2b340 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2b350 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
2b360 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b370 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2b380 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
2b390 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
2b3a0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b3b0 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
2b3c0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2b3d0 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
2b3e0 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
2b3f0 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
2b400 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
2b410 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
2b420 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
2b430 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2b440 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
2b450 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b460 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
2b470 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2b480 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2b490 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2b4a0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
2b4b0 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
2b4c0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2b4d0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2b4e0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2b4f0 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
2b500 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
2b510 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2b520 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
2b530 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2b540 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2b550 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b560 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2b570 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
2b580 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2b590 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2b5a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b5b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b5c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2b5d0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
2b5e0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2b5f0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2b600 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2b610 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2b620 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2b630 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2b640 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2b650 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2b660 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2b670 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b680 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2b690 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2b6a0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
2b6b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b6c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2b6d0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2b6e0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2b6f0 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
2b700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b710 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2b720 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
2b730 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2b740 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2b750 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2b760 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2b770 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2b780 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2b790 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2b7a0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2b7b0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2b7c0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2b7d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2b7e0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
2b7f0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2b800 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2b810 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2b820 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2b830 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b840 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2b850 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2b860 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2b870 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2b880 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2b890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2b8a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2b8b0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2b8c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2b8d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
2b8e0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2b8f0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2b900 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2b910 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2b920 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2b930 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2b940 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2b950 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2b960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2b970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b980 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2b990 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2b9a0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
2b9b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2b9c0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
2b9d0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
2b9e0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
2b9f0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2ba00 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2ba10 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2ba20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2ba30 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2ba40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2ba50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2ba60 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2ba70 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
2ba80 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2ba90 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2baa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2bab0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2bac0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2bad0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
2bae0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
2baf0 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
2bb00 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
2bb10 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
2bb20 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
2bb30 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2bb40 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
2bb50 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2bb60 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
2bb70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2bb80 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
2bb90 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
2bba0 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
2bbb0 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
2bbc0 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
2bbd0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2bbe0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
2bbf0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
2bc00 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2bc10 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
2bc20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2bc30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
2bc40 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
2bc50 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
2bc60 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2bc70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70  Cur->ix==pCur->p
2bc80 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  Page->nCell-1 );
2bc90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2bca0 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  r->pPage->leaf )
2bcb0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
2bcc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2bcd0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2bce0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2bcf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bd00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2bd10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2bd20 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2bd30 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2bd40 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2bd50 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2bd60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bd70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
2bd80 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2bd90 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d  CF_AtLast;.    }
2bda0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
2bdb0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
2bdc0 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
2bdd0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  }.  }else if( rc
2bde0 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29  ==SQLITE_EMPTY )
2bdf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2be00 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2be10 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
2be20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2be30 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
2be40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2be50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2be60 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2be70 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
2be80 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
2be90 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
2bea0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
2beb0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
2bec0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
2bed0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
2bee0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
2bef0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
2bf00 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
2bf10 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
2bf20 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
2bf30 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2bf40 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
2bf50 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
2bf60 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
2bf70 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
2bf80 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
2bf90 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
2bfa0 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
2bfb0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2bfc0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
2bfd0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
2bfe0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
2bff0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
2c000 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
2c010 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
2c020 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
2c030 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
2c040 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
2c050 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
2c060 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
2c070 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
2c080 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
2c090 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
2c0a0 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
2c0b0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
2c0c0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
2c0d0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
2c0e0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
2c0f0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
2c100 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
2c110 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
2c120 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
2c130 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2c140 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2c150 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2c160 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
2c170 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
2c180 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
2c190 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2c1a0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
2c1b0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
2c1c0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
2c1d0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
2c1e0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
2c1f0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
2c200 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2c210 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2c220 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c240 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2c250 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2c260 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2c270 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
2c280 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2c290 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2c2a0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2c2b0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
2c2c0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2c2d0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f  IdxKey..**.** Fo
2c2e0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2c2f0 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53  the pIdxKey->eqS
2c300 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74  een field is set
2c310 20 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a   to 1 if there.*
2c320 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72  * exists an entr
2c330 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  y in the table t
2c340 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63  hat exactly matc
2c350 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a  hes pIdxKey.  .*
2c360 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2c370 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
2c380 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2c390 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
2c3a0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
2c3b0 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
2c3c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
2c3d0 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
2c3e0 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
2c3f0 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
2c400 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c410 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
2c420 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
2c430 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
2c440 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
2c450 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
2c460 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
2c470 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
2c480 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
2c490 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
2c4a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2c4b0 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78   RecordCompare x
2c4c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a  RecordCompare;..
2c4d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2c4e0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2c4f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2c500 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2c510 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2c520 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2c530 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
2c540 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
2c550 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
2c560 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
2c570 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c580 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2c590 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79  ALID || (pIdxKey
2c5a0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72  ==0)==(pCur->cur
2c5b0 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20  IntKey!=0) );.. 
2c5c0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2c5d0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
2c5e0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
2c5f0 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
2c600 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
2c610 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
2c620 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
2c630 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
2c640 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a   if( pIdxKey==0.
2c650 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
2c660 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2c670 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2c680 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2c690 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20  NKey)!=0.  ){.  
2c6a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2c6b0 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
2c6c0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2c6d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2c6e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2c6f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2c700 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
2c710 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75  {.      if( (pCu
2c720 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2c730 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2c740 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2c750 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74   -1;.        ret
2c760 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
2c780 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
2c790 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65   key is one more
2c7a0 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f   than the previo
2c7b0 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20  us key, then.   
2c7c0 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74     ** try to get
2c7d0 20 74 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c   there using sql
2c7e0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2c7f0 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 66 75  rather than a fu
2c800 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61  ll.      ** bina
2c810 72 79 20 73 65 61 72 63 68 2e 20 20 54 68 69 73  ry search.  This
2c820 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2c830 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63  ion only.  The c
2c840 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20  orrect answer.  
2c850 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2c860 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74  obtained without
2c870 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79   this case, only
2c880 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73   a little more s
2c890 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20  lowely */.      
2c8a0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2c8b0 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26  Key+1==intKey &&
2c8c0 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74   !pCur->skipNext
2c8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
2c8e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
2c8f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2c900 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20  Next(pCur, 0);. 
2c910 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2c920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c930 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
2c940 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20  o(pCur);.       
2c950 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2c960 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
2c970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2c980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c990 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c9a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2c9b0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2c9c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c9d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c9e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c9f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ca00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ca10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2ca20 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
2ca30 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2ca40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
2ca50 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
2ca60 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
2ca70 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  errCode = 0;.   
2ca80 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
2ca90 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
2caa0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2cab0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2cac0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
2cad0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2cae0 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
2caf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
2cb00 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
2cb10 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
2cb20 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
2cb30 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
2cb40 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2cb50 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
2cb60 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  c==SQLITE_EMPTY 
2cb70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2cb80 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2cb90 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
2cba0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2cbb0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
2cbc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2cbd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2cbe0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cbf0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
2cc00 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2cc10 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2cc20 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2cc30 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2cc40 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2cc50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cc60 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2cc70 20 3e 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74   > 0 );.  assert
2cc80 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2cc90 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2cca0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75  [0]->intKey==pCu
2ccb0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
2ccc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ccd0 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64  curIntKey || pId
2cce0 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
2ccf0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
2cd00 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
2cd10 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
2cd20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2cd30 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2cd40 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd60 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2cd70 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2cd80 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2cd90 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2cda0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2cdb0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2cdc0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2cdd0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2cde0 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2cdf0 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2ce00 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2ce10 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2ce20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2ce30 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2ce40 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2ce50 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2ce60 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2ce70 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2ce80 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2ce90 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2cea0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2ceb0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2cec0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2ced0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2cee0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2cef0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2cf00 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2cf10 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2cf20 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2cf30 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2cf40 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2cf50 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2cf60 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2cf70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2cf80 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2cf90 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2cfa0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2cfb0 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2cfc0 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2cfd0 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2cfe0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2cff0 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2d000 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2d010 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2d020 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2d030 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2d040 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2d050 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2d060 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2d070 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2d080 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2d090 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2d0a0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2d0b0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2d0c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2d0d0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2d0e0 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2d0f0 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2d100 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2d110 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2d120 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
2d130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d140 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2d150 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2d160 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2d170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d180 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
2d190 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
2d1a0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
2d1b0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
2d1c0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
2d1d0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
2d1e0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2d1f0 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
2d200 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2d210 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
2d220 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2d230 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2d240 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d250 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
2d260 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2d270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d280 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2d290 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
2d2a0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2d2b0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2d2c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2d2d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d2e0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2d2f0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
2d300 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
2d310 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
2d320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d330 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2d340 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
2d350 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
2d360 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
2d370 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
2d380 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2d390 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2d3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
2d3b0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2d3c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d3d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2d3e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d3f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2d400 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2d410 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2d420 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2d430 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2d440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2d450 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
2d460 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2d470 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
2d480 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
2d490 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2d4a0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2d4b0 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2d4c0 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
2d4d0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
2d4e0 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
2d4f0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
2d500 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
2d510 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2d520 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
2d530 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
2d540 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
2d550 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
2d560 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
2d570 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
2d580 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
2d590 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
2d5a0 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
2d5b0 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
2d5c0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
2d5d0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
2d5e0 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
2d5f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2d600 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
2d610 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
2d620 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
2d630 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
2d640 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
2d650 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
2d660 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
2d670 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
2d680 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
2d690 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
2d6a0 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
2d6b0 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
2d6c0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
2d6d0 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
2d6e0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
2d6f0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
2d700 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
2d710 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
2d720 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
2d730 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
2d740 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
2d750 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2d760 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
2d770 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2d780 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
2d790 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
2d7a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2d7b0 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2d7c0 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
2d7d0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2d7e0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2d7f0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2d800 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
2d810 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2d820 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
2d830 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
2d840 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
2d850 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
2d860 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
2d870 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
2d880 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
2d890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d8a0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2d8b0 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
2d8c0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2d8d0 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
2d8e0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
2d8f0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
2d900 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2d910 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d920 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
2d930 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2d940 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2d950 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2d960 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2d970 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
2d980 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2d990 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2d9a0 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
2d9b0 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
2d9c0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
2d9d0 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
2d9e0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
2d9f0 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
2da00 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
2da10 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
2da20 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
2da30 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
2da40 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
2da50 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
2da60 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
2da70 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
2da80 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
2da90 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
2daa0 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
2dab0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2dac0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
2dad0 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
2dae0 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
2daf0 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
2db00 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
2db10 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
2db20 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
2db30 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
2db40 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
2db50 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
2db60 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
2db70 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
2db80 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
2db90 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2dba0 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
2dbb0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2dbc0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
2dbd0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
2dbe0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
2dbf0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
2dc00 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
2dc10 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2dc20 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
2dc30 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
2dc40 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
2dc50 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
2dc60 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
2dc70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
2dc80 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
2dc90 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
2dca0 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
2dcb0 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
2dcc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2dcd0 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
2dce0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2dcf0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
2dd00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2dd10 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
2dd20 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2dd30 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2dd40 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
2dd50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2dd60 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
2dd70 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
2dd80 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
2dd90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2dda0 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20  Cell<2 ){.      
2ddb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ddc0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2ddd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2dde0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2ddf0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2de00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
2de10 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
2de20 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
2de30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2de40 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
2de50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2de60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2de70 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2de80 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2de90 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2dea0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2deb0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2dec0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
2ded0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2dee0 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
2def0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
2df00 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
2df10 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2df20 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
2df30 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20  dOvfl;.         
2df40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2df50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2df60 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2df70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2df80 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2df90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dfa0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2dfb0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2dfc0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2dfd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2dfe0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2dff0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2e000 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2e010 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2e020 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2e030 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2e040 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2e050 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2e060 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2e070 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2e080 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2e090 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2e0a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2e0b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2e0c0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2e0d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2e0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2e0f0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2e100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e110 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2e120 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2e130 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2e140 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e150 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2e160 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2e170 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e180 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2e190 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2e1a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2e1b0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2e1c0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2e1d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2e1e0 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2e1f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e200 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2e210 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2e220 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2e230 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2e240 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2e250 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2e260 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2e270 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2e280 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2e290 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e2a0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2e2b0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2e2c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e2d0 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2e2e0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2e2f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20  .      pCur->ix 
2e300 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2e310 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2e320 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e330 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2e340 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2e350 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2e360 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2e370 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2e380 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2e390 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2e3a0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2e3b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2e3c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e3d0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2e3e0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2e3f0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2e400 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2e410 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2e420 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2e430 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2e440 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2e450 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2e460 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2e470 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73  nSize = 0;.  ass
2e480 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2e490 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2e4a0 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72  dOvfl)==0 );.  r
2e4b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2e4c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2e4d0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2e4e0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2e4f0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2e500 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2e510 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2e520 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2e530 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2e540 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2e550 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2e560 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2e570 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2e580 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2e590 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2e5a0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2e5b0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2e5c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2e5d0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2e5e0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2e5f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2e600 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2e610 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2e620 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2e630 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2e640 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2e650 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2e660 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2e670 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2e680 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2e690 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2e6a0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2e6b0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2e6c0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2e6d0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2e6e0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2e6f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
2e700 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20  stimate for the 
2e710 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2e720 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2e730 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e   pCur is.** poin
2e740 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e  ting to.  Return
2e750 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2e760 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74  er if no estimat
2e770 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a  e is currently .
2e780 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  ** available..*/
2e790 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
2e7a0 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43  eRowCountEst(BtC
2e7b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2e7c0 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a  i64 n;.  u8 i;..
2e7d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2e7e0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2e7f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2e800 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2e810 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2e820 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2e830 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74    /* Currently t
2e840 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
2e850 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
2e860 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72  the OP_IfSmaller
2e870 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e  .  ** opcode, an
2e880 64 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74  d it that case t
2e890 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61  he cursor will a
2e8a0 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61  lways be valid a
2e8b0 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77  nd.  ** will alw
2e8c0 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c  ays point to a l
2e8d0 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69  eaf node. */.  i
2e8e0 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  f( NEVER(pCur->e
2e8f0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2e900 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31  LID) ) return -1
2e910 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
2e920 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d  ur->pPage->leaf=
2e930 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  =0) ) return -1;
2e940 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50  ..  n = pCur->pP
2e950 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f  age->nCell;.  fo
2e960 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69  r(i=0; i<pCur->i
2e970 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
2e980 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  n *= pCur->apPag
2e990 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d  e[i]->nCell;.  }
2e9a0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
2e9b0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
2e9c0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2e9d0 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2e9e0 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20  e database. .** 
2e9f0 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a  Return value:.**
2ea00 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  .**    SQLITE_OK
2ea10 20 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a          success.
2ea20 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  **    SQLITE_DON
2ea30 45 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73  E      cursor is
2ea40 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2ea50 67 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c  g at the last el
2ea60 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65  ement.**    othe
2ea70 72 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d  rwise        som
2ea80 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
2ea90 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54  occurred.**.** T
2eaa0 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2eab0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2eac0 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74  reeNext().  That
2ead0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2eae0 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2eaf0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2eb00 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74  merely increment
2eb10 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
2eb20 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
2eb30 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65  Idx.** to the ne
2eb40 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  xt cell on the c
2eb50 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2eb60 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2eb70 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a  Next() helper.**
2eb80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2eb90 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2eba0 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2ebb0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2ebc0 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73  age or.** to res
2ebd0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2ebe0 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
2ebf0 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
2ec00 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42  ment in sqlite3B
2ec10 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73  treeNext(C,F) is
2ec20 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20   1, then the.** 
2ec30 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
2ec40 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2ec50 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ex and this rout
2ec60 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2ec70 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69  een.** skipped i
2ec80 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20  f the SQL index 
2ec90 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75  had been a uniqu
2eca0 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20  e index.  The F 
2ecb0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61  argument.** is a
2ecc0 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70   hint to the imp
2ecd0 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20  lement.  SQLite 
2ece0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2ecf0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73  tion does not us
2ed00 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20  e.** this hint, 
2ed10 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e  but COMDB2 does.
2ed20 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2ed30 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2ed40 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2ed50 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
2ed60 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
2ed70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2ed80 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2ed90 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2eda0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2edb0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2edc0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2edd0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2ede0 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
2edf0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2ee00 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2ee10 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2ee20 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2ee30 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2ee40 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2ee50 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2ee60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ee70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ee80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ee90 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2eea0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2eeb0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2eec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
2eed0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ONE;.    }.    i
2eee0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2eef0 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2ef00 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2ef10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2ef20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2ef30 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2ef40 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2ef50 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2ef60 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2ef70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
2ef80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2ef90 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2efa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2efb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2efc0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2efd0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2efe0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2eff0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
2f000 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b  dx = ++pCur->ix;
2f010 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f020 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2f030 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2f040 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2f050 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2f060 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2f070 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2f080 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2f090 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2f0a0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2f0b0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2f0c0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2f0d0 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2f0e0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2f0f0 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2f100 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2f110 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2f120 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2f130 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2f140 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2f150 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2f160 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2f170 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2f180 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2f190 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2f1a0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2f1b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2f1c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2f1d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2f1e0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2f1f0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2f200 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2f210 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2f220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2f230 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2f240 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2f250 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2f260 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2f270 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2f280 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2f290 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f2a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2f2b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f2c0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2f2d0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2f2e0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2f2f0 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
2f300 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77  r->pPage;.    }w
2f310 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d  hile( pCur->ix>=
2f320 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2f330 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2f340 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
2f350 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
2f360 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2f370 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f390 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2f3a0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2f3b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f3c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2f3d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2f3e0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2f3f0 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2f400 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2f410 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2f420 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50  t flags){.  MemP
2f430 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e  age *pPage;.  UN
2f440 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
2f450 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65  flags );  /* Use
2f460 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20  d in COMDB2 but 
2f470 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74  not native SQLit
2f480 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63  e */.  assert( c
2f490 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2f4a0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2f4b0 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
2f4c0 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61   flags==1 );.  a
2f4d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2f4e0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2f4f0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2f500 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72  _VALID );.  pCur
2f510 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2f520 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2f530 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2f540 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2f550 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43  dOvfl);.  if( pC
2f560 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f570 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
2f580 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2f590 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2f5a0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
2f5b0 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50  (++pCur->ix)>=pP
2f5c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2f5d0 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
2f5e0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2f5f0 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  xt(pCur);.  }.  
2f600 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2f610 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2f630 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2f640 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2f650 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2f660 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2f670 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2f680 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2f690 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2f6a0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  e..** Return val
2f6b0 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ues:.**.**     S
2f6c0 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63  QLITE_OK     suc
2f6d0 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  cess.**     SQLI
2f6e0 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75  TE_DONE   the cu
2f6f0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2f700 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  on the first ele
2f710 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
2f720 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69  e.**     otherwi
2f730 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64  se     some kind
2f740 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
2f750 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
2f760 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2f770 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2f780 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2f790 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2f7a0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2f7b0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2f7c0 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2f7d0 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2f7e0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2f7f0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2f800 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2f810 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2f820 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2f830 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2f840 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2f850 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2f860 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2f870 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2f880 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2f890 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2f8a0 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
2f8b0 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20  bit 0x01 of the 
2f8c0 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  F argument to sq
2f8d0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2f8e0 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  us(C,F) is 1, th
2f8f0 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  en.** the cursor
2f900 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2f910 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2f920 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2f930 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
2f940 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
2f950 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2f960 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
2f970 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
2f980 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20  nt is a.** hint 
2f990 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
2f9a0 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51  .  The native SQ
2f9b0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2f9c0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2f9d0 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68  ot.** use this h
2f9e0 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
2f9f0 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
2fa00 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2fa10 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
2fa20 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2fa30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2fa40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
2fa50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2fa60 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2fa70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2fa80 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2fa90 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2faa0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2fab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2fac0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2fad0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2fae0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2faf0 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2fb00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2fb10 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2fb20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2fb30 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2fb40 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2fb50 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2fb60 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2fb70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2fb80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2fb90 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2fba0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2fbb0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2fbc0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2fbd0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2fbe0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2fbf0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2fc00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2fc10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2fc20 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2fc30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2fc40 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2fc50 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2fc60 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2fc70 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2fc80 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2fc90 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2fca0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2fcb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2fcc0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2fcd0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2fce0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2fcf0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2fd00 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2fd10 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2fd20 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2fd30 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
2fd40 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a  idx = pCur->ix;.
2fd50 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2fd60 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2fd70 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2fd80 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
2fd90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2fda0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
2fdb0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2fdc0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2fdd0 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78   while( pCur->ix
2fde0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2fdf0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2fe00 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2fe10 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2fe20 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2fe30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fe40 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
2fe50 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2fe60 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2fe70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fe80 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2fe90 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2fea0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2feb0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29  BTCF_ValidOvfl))
2fec0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72  ==0 );..    pCur
2fed0 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67  ->ix--;.    pPag
2fee0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2fef0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2ff00 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2ff10 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2ff20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ff30 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2ff40 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
2ff50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ff60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2ff70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2ff80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2ff90 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2ffa0 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73  *pCur, int flags
2ffb0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2ffc0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2ffd0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ffe0 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
2fff0 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  lags==1 );.  ass
30000 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
30010 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
30020 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
30030 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53 45 44  ALID );.  UNUSED
30040 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67  _PARAMETER( flag
30050 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e  s );  /* Used in
30060 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20   COMDB2 but not 
30070 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f  native SQLite */
30080 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
30090 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
300a0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
300b0 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
300c0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
300d0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
300e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
300f0 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
30100 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20  | pCur->ix==0.  
30110 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   || pCur->pPage-
30120 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
30130 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
30140 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20  evious(pCur);.  
30150 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a  }.  pCur->ix--;.
30160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30170 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
30180 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
30190 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
301a0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
301b0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
301c0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
301d0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
301e0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
301f0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
30200 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
30210 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
30220 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
30230 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
30240 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
30250 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
30260 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
30270 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
30280 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
30290 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
302a0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
302b0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
302c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
302d0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
302e0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
302f0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
30300 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
30310 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
30320 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
30330 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
30340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
30350 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
30360 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
30370 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
30380 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
30390 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
303a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
303b0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
303c0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
303d0 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
303e0 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
303f0 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
30400 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
30410 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
30420 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
30430 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
30440 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
30450 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
30460 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
30470 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
30480 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
30490 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
304a0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
304b0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
304c0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
304d0 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
304e0 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
304f0 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
30500 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
30510 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
30520 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
30530 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
30540 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
30550 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
30560 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
30570 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
30580 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
30590 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
305a0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
305b0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
305c0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
305d0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
305e0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
305f0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
30600 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
30610 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30620 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
30630 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
30640 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
30650 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
30660 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
30670 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
30680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
30690 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
306a0 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
306b0 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
306c0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
306d0 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
306e0 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
306f0 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
30700 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
30710 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
30720 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
30730 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
30740 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
30750 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
30760 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
30770 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
30780 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
30790 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
307a0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
307b0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
307c0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
307d0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
307e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
307f0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
30800 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30810 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
30820 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
30830 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
30840 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
30850 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
30860 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
30870 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
30880 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
30890 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
308a0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
308b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
308c0 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
308d0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
308e0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
308f0 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
30900 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
30910 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
30920 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
30930 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
30940 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
30950 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
30960 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
30970 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
30980 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
30990 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
309a0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
309b0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
309c0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
309d0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
309e0 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
309f0 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
30a00 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
30a10 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
30a20 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
30a30 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
30a40 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
30a50 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
30a60 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
30a70 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
30a80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
30a90 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
30aa0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
30ab0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
30ac0 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
30ad0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
30ae0 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
30af0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
30b00 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
30b10 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
30b20 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
30b30 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
30b40 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
30b50 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
30b60 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
30b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30b80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
30b90 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
30ba0 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
30bb0 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
30bc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
30bd0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
30be0 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
30bf0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
30c00 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
30c10 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
30c20 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
30c30 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
30c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
30c50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30c60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
30c70 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
30c80 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
30c90 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
30ca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30cb0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
30cc0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
30cd0 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
30ce0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
30cf0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
30d00 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
30d10 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
30d20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
30d30 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
30d40 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
30d50 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
30d60 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
30d70 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
30d80 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
30d90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30da0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
30db0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
30dc0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30dd0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
30de0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
30df0 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
30e00 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
30e10 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
30e20 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
30e30 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
30e40 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
30e50 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
30e60 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
30e70 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
30e80 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
30e90 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
30ea0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
30eb0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
30ec0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
30ed0 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
30ee0 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
30ef0 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
30f00 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
30f10 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
30f20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
30f30 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
30f40 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
30f50 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
30f60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
30f70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
30f80 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
30f90 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
30fa0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
30fb0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
30fc0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
30fd0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
30fe0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
30ff0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
31000 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
31010 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
31020 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
31030 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
31040 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
31050 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
31060 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
31070 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31080 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
31090 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
310a0 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
310b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
310c0 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
310d0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
310e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
310f0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
31100 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
31110 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
31120 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
31130 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
31140 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
31150 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
31160 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
31170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31180 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
31190 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
311a0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
311b0 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
311c0 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
311d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
311e0 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
311f0 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
31200 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
31210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31220 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
31230 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
31240 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
31250 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
31260 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31270 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
31280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31290 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
312a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
312b0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
312c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
312d0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
312e0 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
312f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
31300 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
31310 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
31320 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31330 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
31340 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
31350 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
31360 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
31370 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
31380 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
31390 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
313a0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
313b0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
313c0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
313d0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
313e0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
313f0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
31400 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
31410 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
31420 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
31430 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
31440 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
31450 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
31460 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
31470 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
31480 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31490 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
314a0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
314b0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
314c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
314d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
314e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
314f0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
31500 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
31510 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
31520 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
31530 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
31540 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
31550 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
31560 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
31570 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
31580 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
31590 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
315a0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
315b0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
315c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
315d0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
315e0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
315f0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
31600 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
31610 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
31620 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
31630 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31640 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
31650 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
31660 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
31670 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
31680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31690 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
316a0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
316b0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
316c0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
316d0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
316e0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
316f0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
31700 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
31710 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
31720 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
31730 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
31740 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
31750 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
31760 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
31770 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
31780 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
31790 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
317a0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
317b0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
317c0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
317d0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
317e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
317f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
31800 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
31810 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
31820 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
31830 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31840 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
31850 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
31860 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
31870 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
31880 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
31890 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
318a0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
318b0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
318c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
318d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
318e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
318f0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
31900 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31910 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31930 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31940 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31960 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
31970 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
31980 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
31990 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
319a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
319b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
319c0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
319d0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
319e0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
319f0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
31a00 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
31a10 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
31a20 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
31a30 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
31a40 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
31a50 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
31a60 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
31a70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
31a80 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
31a90 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
31aa0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
31ab0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
31ac0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
31ad0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
31ae0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
31af0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31b00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
31b10 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
31b20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
31b30 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
31b40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31b50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31b60 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
31b70 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
31b80 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
31b90 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
31ba0 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
31bb0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
31bc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31be0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31bf0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31c20 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
31c30 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
31c40 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31c60 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
31c70 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
31c80 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
31c90 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31ca0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
31cb0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
31cc0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
31cd0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
31ce0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
31cf0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
31d00 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
31d10 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
31d20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
31d30 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
31d40 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
31d50 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
31d60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
31d70 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
31d80 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
31d90 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
31da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
31db0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
31dc0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
31dd0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
31de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
31df0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31e00 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
31e10 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
31e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31e30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31e40 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
31e50 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
31e60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
31e70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
31e80 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
31e90 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
31ea0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31eb0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
31ec0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
31ed0 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
31ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31f00 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
31f10 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
31f20 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
31f30 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
31f40 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
31f50 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
31f60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
31f70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
31f80 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
31f90 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
31fa0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
31fb0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
31fc0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
31fd0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
31fe0 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
31ff0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
32000 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
32010 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
32020 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
32030 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
32040 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
32050 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
32060 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
32070 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
32080 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
32090 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
320a0 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
320b0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
320c0 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
320d0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
320e0 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
320f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
32100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
32110 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
32120 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32130 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
32140 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
32150 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
32160 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
32170 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
32180 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
32190 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
321a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
321b0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
321c0 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
321d0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
321e0 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
321f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32200 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
32220 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
32230 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
32240 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
32250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
32270 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
32280 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
32290 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
322a0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
322b0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
322c0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
322d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
322e0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
322f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
32300 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
32310 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
32320 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
32330 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
32340 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32350 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32370 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
32380 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32390 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
323a0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
323b0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
323c0 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
323d0 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
323e0 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
323f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
32400 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
32410 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
32420 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
32430 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
32440 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
32450 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
32460 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
32470 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
32480 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
32490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324a0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
324b0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
324c0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
324d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
324e0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
324f0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32500 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32510 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32520 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32530 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
32540 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
32550 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
32560 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
32570 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
32580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32590 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
325a0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
325b0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
325c0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
325d0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
325e0 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
325f0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
32600 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32610 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
32620 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
32630 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
32640 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
32650 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32670 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32680 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
32690 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
326a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
326b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
326c0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
326d0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
326e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
326f0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
32700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32720 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
32730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32740 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
32750 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
32760 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
32770 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
32780 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
32790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
327a0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
327b0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
327c0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
327d0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
327e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
327f0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
32800 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
32810 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
32820 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
32830 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
32840 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
32850 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
32860 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
32870 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
32880 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
32890 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
328a0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
328b0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
328c0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
328d0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
328e0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
328f0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
32900 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
32910 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
32920 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
32930 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
32940 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
32950 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
32960 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
32970 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
32980 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
32990 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
329a0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
329b0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
329c0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
329d0 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
329e0 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
329f0 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
32a00 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
32a10 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
32a20 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
32a30 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
32a40 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
32a50 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
32a60 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
32a70 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
32a80 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
32a90 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
32aa0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
32ab0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
32ac0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
32ad0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
32ae0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
32af0 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
32b00 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
32b10 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
32b20 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
32b30 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
32b40 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
32b50 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
32b60 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
32b70 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
32b80 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
32b90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
32ba0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
32bb0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
32bc0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
32bd0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
32be0 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
32bf0 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
32c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32c10 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
32c20 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
32c30 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
32c40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
32c50 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
32c60 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
32c70 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
32c80 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
32c90 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
32ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32cb0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
32cc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
32cd0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
32ce0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
32cf0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
32d00 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
32d10 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
32d20 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
32d30 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
32d40 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
32d50 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
32d60 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
32d70 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
32d80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
32d90 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
32da0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
32db0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
32dc0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
32dd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
32de0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
32df0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
32e00 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
32e10 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
32e20 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
32e30 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
32e40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32e50 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
32e60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
32e70 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
32e80 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
32e90 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
32ea0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
32eb0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
32ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32ed0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
32ee0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32ef0 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
32f00 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32f10 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
32f20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
32f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32f40 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
32f50 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
32f60 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
32f70 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
32f80 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
32f90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32fa0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
32fb0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
32fc0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
32fd0 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
32fe0 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
32ff0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
33000 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
33010 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
33020 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
33030 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
33040 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
33050 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
33060 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33070 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
33080 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
33090 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
330a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
330b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
330c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
330d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
330e0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
330f0 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
33100 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
33110 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
33120 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
33130 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
33140 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33150 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
33160 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
33170 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
33180 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
33190 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
331a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
331b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
331c0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
331d0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
331e0 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
331f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
33200 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
33210 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
33220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33230 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
33240 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
33250 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
33260 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
33270 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
33280 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
33290 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
332a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
332b0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
332c0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
332d0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
332e0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
332f0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
33300 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
33310 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
33320 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
33330 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
33340 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
33350 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
33360 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
33370 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
33380 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
33390 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
333a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
333b0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
333c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
333d0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
333e0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
333f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
33400 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
33410 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
33420 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
33430 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
33440 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
33450 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
33460 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
33470 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
33480 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
33490 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
334a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
334b0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
334c0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
334d0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
334e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
334f0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
33500 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
33510 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
33520 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
33530 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
33540 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
33550 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
33560 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
33570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33580 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
33590 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
335a0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
335b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
335c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335d0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
335e0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
335f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33600 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
33610 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
33620 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
33630 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
33640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33650 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
33660 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
33670 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
33680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
33690 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
336a0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
336b0 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
336c0 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
336d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
336e0 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
336f0 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
33700 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
33710 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
33720 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
33730 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
33740 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
33750 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
33760 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
33770 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
33780 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
33790 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
337a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
337b0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
337c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
337d0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
337e0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
337f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33800 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
33810 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33820 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
33830 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
33840 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
33850 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
33860 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
33870 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
33880 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
33890 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
338a0 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
338b0 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
338c0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
338d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
338e0 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
338f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
33900 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
33910 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
33920 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
33930 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33940 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
33950 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
33960 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
33970 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
33980 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
33990 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
339a0 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
339b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
339c0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
339d0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
339e0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
339f0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
33a00 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
33a10 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
33a20 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
33a30 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
33a40 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
33a50 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
33a60 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
33a70 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
33a80 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
33a90 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
33aa0 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
33ab0 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
33ac0 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
33ad0 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
33ae0 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
33af0 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
33b00 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
33b10 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
33b20 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
33b30 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
33b40 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
33b50 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
33b60 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
33b70 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
33b80 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
33b90 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
33ba0 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
33bb0 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
33bc0 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
33bd0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
33be0 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
33bf0 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
33c00 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
33c10 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
33c20 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
33c30 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
33c40 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
33c50 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
33c60 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
33c70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
33c80 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
33c90 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
33ca0 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
33cb0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
33cc0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33cd0 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
33ce0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
33cf0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
33d00 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
33d10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33d20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
33d30 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
33d40 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
33d50 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
33d60 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
33d70 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
33d80 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
33d90 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
33da0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
33db0 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
33dc0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33dd0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
33de0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33df0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
33e00 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
33e10 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
33e20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
33e30 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
33e40 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
33e50 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
33e60 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
33e70 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
33e80 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
33e90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33ea0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
33eb0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
33ec0 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
33ed0 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
33ee0 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
33ef0 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
33f00 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
33f10 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
33f20 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
33f30 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
33f40 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
33f50 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
33f60 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
33f70 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
33f80 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
33f90 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
33fa0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
33fb0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
33fc0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
33fd0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
33fe0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
33ff0 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
34000 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
34010 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
34020 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
34030 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
34040 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
34050 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
34060 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
34070 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
34080 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
34090 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
340a0 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
340b0 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
340c0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
340d0 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
340e0 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
340f0 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
34100 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
34110 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
34120 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
34130 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
34140 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
34150 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
34160 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
34170 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
34180 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
34190 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
341a0 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
341b0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
341c0 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
341d0 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
341e0 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
341f0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
34200 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34210 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
34220 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
34230 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
34240 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
34250 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
34260 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
34270 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
34280 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
34290 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
342a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
342b0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
342c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
342d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
342e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
342f0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
34300 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
34310 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
34320 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
34330 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
34340 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
34350 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
34360 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
34370 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
34380 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
34390 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
343a0 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
343b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
343c0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
343d0 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
343e0 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
343f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
34400 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
34410 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
34420 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
34430 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
34440 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
34450 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
34460 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
34470 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
34480 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
34490 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
344a0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
344b0 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
344c0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
344d0 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
344e0 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
344f0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
34500 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
34510 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
34520 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
34530 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
34540 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
34550 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
34560 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
34570 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
34580 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
34590 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
345a0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
345b0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
345c0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
345d0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
345e0 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
345f0 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
34600 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
34610 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
34620 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
34630 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
34640 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34650 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
34660 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
34670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34680 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
34690 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
346a0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
346b0 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
346c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
346d0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
346e0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
346f0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
34700 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
34710 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
34720 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
34730 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
34740 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
34750 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
34760 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
34770 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
34780 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
34790 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
347a0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
347b0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
347c0 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
347d0 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
347e0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
347f0 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
34800 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
34810 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
34820 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
34830 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
34840 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
34850 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
34860 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
34870 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
34880 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53  e given Cell.  S
34890 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66  tore.** size inf
348a0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
348b0 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f  he cell in pInfo
348c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
348d0 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
348e0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
348f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
34900 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
34910 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
34920 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
34930 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
34940 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
34950 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
34960 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f  pInfo          /
34970 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * Size informati
34980 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
34990 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  l */.){.  BtShar
349a0 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ed *pBt;.  Pgno 
349b0 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
349c0 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
349d0 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
349e0 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
349f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
34a00 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
34a10 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
34a20 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
34a30 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
34a40 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  );.  if( pInfo->
34a50 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e  nLocal==pInfo->n
34a60 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72  Payload ){.    r
34a70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34a80 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
34a90 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
34aa0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
34ab0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 74  thing */.  }.  t
34ac0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b  estcase( pCell +
34ad0 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d   pInfo->nSize ==
34ae0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
34af0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
34b00 70 43 65 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e  pCell + (pInfo->
34b10 6e 53 69 7a 65 2d 31 29 20 3d 3d 20 70 50 61 67  nSize-1) == pPag
34b20 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
34b30 20 69 66 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e   if( pCell + pIn
34b40 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70 50 61 67  fo->nSize > pPag
34b50 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20  e->aDataEnd ){. 
34b60 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e     /* Cell exten
34b70 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
34b80 61 67 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  age */.    retur
34b90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34ba0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
34bb0 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
34bc0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20  et4byte(pCell + 
34bd0 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34  pInfo->nSize - 4
34be0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
34bf0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
34c00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34c10 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
34c20 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
34c30 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
34c40 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e  nOvfl = (pInfo->
34c50 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f  nPayload - pInfo
34c60 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  ->nLocal + ovflP
34c70 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
34c80 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
34c90 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
34ca0 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
34cb0 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79   && (pInfo->nPay
34cc0 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53  load + ovflPageS
34cd0 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a  ize)<ovflPageSiz
34ce0 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  e).  );.  while(
34cf0 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
34d00 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
34d10 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
34d20 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
34d30 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
34d40 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
34d50 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
34d60 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
34d70 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
34d80 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
34d90 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
34da0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
34db0 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
34dc0 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
34dd0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
34de0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
34df0 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
34e00 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
34e10 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
34e20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34e30 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
34e40 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
34e50 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
34e60 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
34e70 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
34e80 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
34e90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
34ea0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
34eb0 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
34ec0 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
34ed0 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
34ee0 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
34ef0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
34f00 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
34f10 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
34f20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
34f30 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
34f40 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
34f50 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
34f60 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
34f70 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
34f80 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
34f90 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
34fa0 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
34fb0 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
34fc0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
34fd0 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
34fe0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
34ff0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
35000 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
35010 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
35020 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
35030 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
35040 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
35050 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
35060 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
35070 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
35080 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
35090 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
350a0 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
350b0 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
350c0 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
350d0 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
350e0 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
350f0 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
35100 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
35110 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
35120 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
35130 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
35140 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
35150 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
35160 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
35170 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
35180 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
35190 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
351a0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
351b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
351c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
351d0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
351e0 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
351f0 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
35200 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
35210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
35220 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
35230 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
35240 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
35250 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
35260 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
35270 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
35280 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
35290 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
352a0 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
352b0 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
352c0 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
352d0 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
352e0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
352f0 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
35300 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
35310 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
35320 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
35330 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
35340 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
35350 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
35360 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
35370 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
35380 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
35390 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
353a0 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
353b0 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
353c0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
353d0 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
353e0 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
353f0 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
35400 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
35410 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
35420 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
35430 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
35440 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
35450 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
35460 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
35470 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
35480 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
35490 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
354a0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
354b0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
354c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
354d0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
354e0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
354f0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
35500 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
35510 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
35520 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
35530 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20  st BtreePayload 
35540 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  *pX,        /* P
35550 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63  ayload with whic
35560 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  h to construct t
35570 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
35580 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
35590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
355a0 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
355b0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
355c0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
355d0 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
355e0 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d  t nSrc, n, rc, m
355f0 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  n;.  int spaceLe
35600 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
35610 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73  ToRelease;.  uns
35620 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
35630 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
35640 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
35650 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
35660 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b    Pgno pgnoOvfl;
35670 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
35680 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35690 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
356a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
356b0 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
356c0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
356d0 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
356e0 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
356f0 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
35700 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
35710 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
35720 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
35730 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
35740 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
35750 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
35760 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
35770 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  a[pPage->pBt->pa
35780 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
35790 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
357a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
357b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
357c0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
357d0 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
357e0 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
357f0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
35800 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
35810 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c  Key ){.    nPayl
35820 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20  oad = pX->nData 
35830 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20  + pX->nZero;.   
35840 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74   pSrc = pX->pDat
35850 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58  a;.    nSrc = pX
35860 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->nData;.    ass
35870 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
35880 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c  eyLeaf ); /* fil
35890 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63  lInCell() only c
358a0 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73  alled for leaves
358b0 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20   */.    nHeader 
358c0 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
358d0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
358e0 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e  nPayload);.    n
358f0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
35900 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
35910 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d  er], *(u64*)&pX-
35920 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
35930 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
35940 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66  >nKey<=0x7ffffff
35950 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30  f && pX->pKey!=0
35960 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e   );.    nSrc = n
35970 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70  Payload = (int)p
35980 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  X->nKey;.    pSr
35990 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20  c = pX->pKey;.  
359a0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
359b0 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
359c0 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
359d0 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ad);.  }.  .  /*
359e0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
359f0 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f  load */.  pPaylo
35a00 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
35a10 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79  der];.  if( nPay
35a20 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
35a30 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
35a40 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d  This is the comm
35a50 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 65 76  on case where ev
35a60 65 72 79 74 68 69 6e 67 20 66 69 74 73 20 6f 6e  erything fits on
35a70 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 0a   the btree page.
35a80 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76      ** and no ov
35a90 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
35aa0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
35ab0 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20    n = nHeader + 
35ac0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65  nPayload;.    te
35ad0 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a  stcase( n==3 );.
35ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
35af0 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  =4 );.    if( n<
35b00 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a  4 ) n = 4;.    *
35b10 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  pnSize = n;.    
35b20 61 73 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50  assert( nSrc<=nP
35b30 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74 65  ayload );.    te
35b40 73 74 63 61 73 65 28 20 6e 53 72 63 3c 6e 50 61  stcase( nSrc<nPa
35b50 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d  yload );.    mem
35b60 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
35b70 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d  rc, nSrc);.    m
35b80 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e  emset(pPayload+n
35b90 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64  Src, 0, nPayload
35ba0 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72 65 74 75  -nSrc);.    retu
35bb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
35bc0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
35bd0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
35be0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  it means that so
35bf0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  me of the conten
35c00 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a  t will need.  **
35c10 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f   to spill onto o
35c20 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
35c30 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65   */.  mn = pPage
35c40 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20  ->minLocal;.  n 
35c50 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64  = mn + (nPayload
35c60 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d   - mn) % (pPage-
35c70 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35c80 20 2d 20 34 29 3b 0a 20 20 74 65 73 74 63 61 73   - 4);.  testcas
35c90 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
35ca0 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
35cb0 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
35cc0 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
35cd0 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
35ce0 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
35cf0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e  .  spaceLeft = n
35d00 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20  ;.  *pnSize = n 
35d10 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
35d20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
35d30 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70  [nHeader+n];.  p
35d40 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
35d50 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
35d60 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
35d70 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  t;..  /* At this
35d80 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
35d90 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
35da0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
35db0 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
35dc0 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
35dd0 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
35de0 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
35df0 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
35e00 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
35e10 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
35e20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
35e30 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
35e40 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
35e50 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
35e60 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
35e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e80 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
35e90 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
35ea0 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
35eb0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
35ec0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
35ed0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
35ee0 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
35ef0 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
35f00 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
35f10 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
35f20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
35f30 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
35f40 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
35f50 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
35f60 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
35f70 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
35f80 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
35f90 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
35fa0 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
35fb0 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
35fc0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
35fd0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
35fe0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
35ff0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
36000 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
36010 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
36020 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69  ert( nHeader==(i
36030 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
36040 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
36050 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
36060 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b  Key==pX->nKey );
36070 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e  .    assert( *pn
36080 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69  Size == info.nSi
36090 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
360a0 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69  ( spaceLeft == i
360b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20  nfo.nLocal );.  
360c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57  }.#endif..  /* W
360d0 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64  rite the payload
360e0 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
360f0 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74  Cell and any ext
36100 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ra into overflow
36110 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c   pages */.  whil
36120 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20  e( 1 ){.    n = 
36130 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
36140 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
36150 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
36160 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
36170 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
36180 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
36190 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
361a0 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
361b0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
361c0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
361d0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
361e0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
361f0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
36200 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
36210 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36220 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
36230 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
36240 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
36250 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
36260 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
36270 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
36280 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
36290 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
362a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
362b0 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
362c0 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
362d0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
362e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
362f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
36300 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36310 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
36320 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
36330 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20   nSrc>=n ){.    
36340 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
36350 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
36360 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3e   }else if( nSrc>
36370 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e  0 ){.      n = n
36380 53 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  Src;.      memcp
36390 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
363a0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
363b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
363c0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
363d0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
363e0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  d -= n;.    if( 
363f0 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72  nPayload<=0 ) br
36400 65 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  eak;.    pPayloa
36410 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
36420 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
36430 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
36440 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
36450 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
36460 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
36470 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e  *pOvfl = 0;.#ifn
36480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36490 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
364a0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
364b0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
364c0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
364d0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
364e0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
364f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
36500 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
36510 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
36520 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
36530 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
36540 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
36550 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
36560 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
36570 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
36580 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
36590 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
365a0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
365b0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
365c0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
365d0 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
365e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
365f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36600 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
36610 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
36620 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
36630 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
36640 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
36650 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
36660 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
36670 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
36680 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
36690 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
366a0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
366b0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
366c0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
366d0 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
366e0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
366f0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
36700 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
36710 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
36720 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
36730 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
36740 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
36750 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
36760 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
36770 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
36780 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
36790 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
367a0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
367b0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
367c0 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
367d0 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
367e0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
367f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
36800 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36810 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
36820 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
36830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36840 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
36850 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
36860 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
36870 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
36880 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
36890 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
368a0 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
368b0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
368c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
368d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
368e0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
368f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
36900 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
36910 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
36920 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
36930 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
36940 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
36950 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
36960 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
36970 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
36980 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
36990 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
369a0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
369b0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
369c0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
369d0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
369e0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
369f0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
36a00 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36a10 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
36a20 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
36a30 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
36a40 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
36a50 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
36a60 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
36a70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
36a80 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
36a90 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
36aa0 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
36ab0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
36ac0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
36ad0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
36ae0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
36af0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36b00 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
36b10 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
36b20 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
36b30 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
36b40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
36b50 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
36b60 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
36b70 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
36b80 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
36b90 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
36ba0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
36bb0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
36bc0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
36bd0 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
36be0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
36bf0 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   - 4;.    }.  }.
36c00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
36c10 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
36c20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
36c30 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
36c40 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
36c50 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
36c60 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
36c70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
36c80 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
36c90 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
36ca0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
36cb0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
36cc0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
36cd0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
36ce0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
36cf0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
36d00 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
36d10 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
36d20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
36d30 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
36d40 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
36d50 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
36d60 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
36d70 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
36d80 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
36d90 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
36da0 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
36db0 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
36dc0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
36dd0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
36de0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
36df0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
36e00 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
36e10 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
36e20 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
36e30 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
36e40 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
36e50 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
36e60 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
36e70 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
36e80 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
36e90 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
36ea0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
36eb0 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
36ec0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
36ed0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
36ee0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rn;.  assert( id
36ef0 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
36f00 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
36f10 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
36f20 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
36f30 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
36f40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36f50 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36f60 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36f70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
36f80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36f90 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
36fa0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
36fb0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
36fc0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
36fd0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
36fe0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
36ff0 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
37000 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
37010 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
37020 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
37030 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
37040 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
37050 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
37060 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 2b  ize );.  if( pc+
37070 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
37080 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
37090 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
370a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
370b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
370c0 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
370d0 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
370e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
370f0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
37100 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
37110 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69  ge->nCell--;.  i
37120 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
37130 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  =0 ){.    memset
37140 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
37150 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  , 4);.    data[h
37160 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70  dr+7] = 0;.    p
37170 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
37180 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74  r+5], pPage->pBt
37190 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
371a0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
371b0 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
371c0 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65  ableSize - pPage
371d0 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20  ->hdrOffset.    
371e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371f0 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c     - pPage->chil
37200 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20  dPtrSize - 8;.  
37210 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f  }else{.    memmo
37220 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32  ve(ptr, ptr+2, 2
37230 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
37240 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32   idx));.    put2
37250 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
37260 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
37270 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
37280 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a  ee += 2;.  }.}..
37290 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
372a0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
372b0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
372c0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
372d0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
372e0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
372f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
37300 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
37310 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
37320 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
37330 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
37340 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
37350 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
37360 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37370 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
37380 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
37390 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
373a0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
373b0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
373c0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
373d0 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
373e0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
373f0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
37400 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
37410 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
37420 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
37430 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
37440 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
37450 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
37460 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
37470 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
37480 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
37490 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
374a0 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74  .**.** *pRC must
374b0 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68   be SQLITE_OK wh
374c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
374d0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
374e0 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
374f0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
37500 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
37510 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
37520 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
37530 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
37540 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
37550 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
37560 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
37570 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
37580 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
37590 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
375a0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
375b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
375c0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
375d0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
375e0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
375f0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
37600 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
37610 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
37620 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
37630 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
37640 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
37650 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
37660 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
37670 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
37680 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
37690 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
376a0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
376b0 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
376c0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
376d0 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
376e0 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
376f0 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
37700 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
37710 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
37720 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
37730 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
37740 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
37750 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20  u8 *pIns;       
37760 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
37770 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  n pPage->aCellId
37780 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c  x[] where no cel
37790 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20  l inserted */.. 
377a0 20 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53   assert( *pRC==S
377b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
377c0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
377d0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
377e0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
377f0 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43  ;.  assert( MX_C
37800 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
37810 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
37820 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
37830 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
37840 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54  >pBt) || CORRUPT
37850 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
37860 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
37870 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
37880 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
37890 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
378a0 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
378b0 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
378c0 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
378d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
378e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
378f0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
37900 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
37910 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
37920 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
37930 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
37940 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
37950 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
37960 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
37970 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
37980 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
37990 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
379a0 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
379b0 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
379c0 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
379d0 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
379e0 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
379f0 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
37a00 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
37a10 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
37a20 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
37a30 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
37a40 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
37a50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
37a60 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
37a70 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78  rt( sz==pPage->x
37a80 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
37a90 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38  pCell) || (sz==8
37aa0 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b   && iChild>0) );
37ab0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
37ac0 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
37ad0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
37ae0 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
37af0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
37b00 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  emp, pCell, sz);
37b10 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
37b20 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
37b30 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
37b40 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
37b50 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
37b60 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
37b70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
37b80 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
37b90 20 61 67 61 69 6e 73 74 20 41 72 72 61 79 53 69   against ArraySi
37ba0 7a 65 2d 31 20 73 69 6e 63 65 20 77 65 20 68 6f  ze-1 since we ho
37bb0 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65 78 74 72  ld back one extr
37bc0 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73  a slot.    ** as
37bd0 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20   a contingency. 
37be0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
37bf0 20 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f 72 65   never need more
37c00 20 74 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77   than 3 overflow
37c10 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75  .    ** slots bu
37c20 74 20 34 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  t 4 are allocate
37c30 64 2c 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  d, just to be sa
37c40 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  fe. */.    asser
37c50 74 28 20 6a 20 3c 20 41 72 72 61 79 53 69 7a 65  t( j < ArraySize
37c60 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d  (pPage->apOvfl)-
37c70 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  1 );.    pPage->
37c80 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
37c90 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
37ca0 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
37cb0 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ;..    /* When m
37cc0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
37cd0 73 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72  s occur, they ar
37ce0 65 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74  e always sequent
37cf0 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a  ial and in.    *
37d00 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  * sorted order. 
37d10 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73   This invariants
37d20 20 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d   arise because m
37d30 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
37d40 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c  s can.    ** onl
37d50 79 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73  y occur when ins
37d60 65 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63  erting divider c
37d70 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
37d80 72 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67  rent page during
37d90 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  .    ** balancin
37da0 67 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  g, and the divid
37db0 65 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74  ers are adjacent
37dc0 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20   and sorted..   
37dd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
37de0 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61  j==0 || pPage->a
37df0 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29  iOvfl[j-1]<(u16)
37e00 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  i ); /* Overflow
37e10 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
37e20 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
37e30 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67   j==0 || i==pPag
37e40 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31  e->aiOvfl[j-1]+1
37e50 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f   );   /* Overflo
37e60 77 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61  ws are sequentia
37e70 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l */.  }else{.  
37e80 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
37e90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
37ea0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
37eb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37ec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
37ed0 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
37ee0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
37ef0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
37f00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37f10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
37f20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
37f30 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
37f40 61 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50  assert( &data[pP
37f50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d  age->cellOffset]
37f60 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  ==pPage->aCellId
37f70 78 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  x );.    rc = al
37f80 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
37f90 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
37fa0 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
37fb0 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
37fc0 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
37fd0 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
37fe0 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
37ff0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
38000 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
38010 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
38020 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20  cessfully */.   
38030 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
38040 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
38050 20 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63   idx >= pPage->c
38060 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
38070 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f  e->nCell+2 || CO
38080 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
38090 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
380a0 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
380b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
380c0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
380d0 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
380e0 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
380f0 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c  data[idx], pCell
38100 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69  , sz);.    if( i
38110 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
38120 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
38130 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
38140 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50   }.    pIns = pP
38150 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20  age->aCellIdx + 
38160 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  i*2;.    memmove
38170 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32  (pIns+2, pIns, 2
38180 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
38190 20 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79   i));.    put2by
381a0 74 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20  te(pIns, idx);. 
381b0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
381c0 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d  +;.    /* increm
381d0 65 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ent the cell cou
381e0 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b  nt */.    if( (+
381f0 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  +data[pPage->hdr
38200 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20  Offset+4])==0 ) 
38210 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
38220 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20  ffset+3]++;.    
38230 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
38240 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
38250 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61  rOffset+3])==pPa
38260 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66  ge->nCell );.#if
38270 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
38280 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
38290 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
382a0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
382b0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
382c0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
382d0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
382e0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
382f0 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
38300 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
38310 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
38320 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
38330 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
38340 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
38350 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
38360 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
38370 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
38380 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79  *.** A CellArray
38390 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
383a0 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e   a cache of poin
383b0 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66  ters and sizes f
383c0 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74  or a.** consecut
383d0 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ive sequence of 
383e0 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74  cells that might
383f0 20 62 65 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74   be held on mult
38400 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74  iple pages..*/.t
38410 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65  ypedef struct Ce
38420 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61  llArray CellArra
38430 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72  y;.struct CellAr
38440 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c  ray {.  int nCel
38450 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
38460 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
38470 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
38480 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65  /.  MemPage *pRe
38490 66 3b 20 20 20 20 20 20 20 20 20 20