/ Hex Artifact Content
Login

Artifact 05781141fe24e9e24719a1d9c9b6ce38480af115f85a8a26f389a089888060d7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3a70: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3a80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3a90: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3aa0: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
3ab0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
3ac0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
3ad0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
3ae0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
3af0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
3b00: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3b10: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3b20: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3b30: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3b40: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3b50: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3b60: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3b70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3b80: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3b90: 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  }../* Verify tha
3ba0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  t the cursor and
3bb0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 61 67   the BtShared ag
3bc0: 72 65 65 20 61 62 6f 75 74 20 77 68 61 74 20 69  ree about what i
3bd0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  s the current.**
3be0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74   database connet
3bf0: 69 6f 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70  ion. This is imp
3c00: 6f 72 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64  ortant in shared
3c10: 2d 63 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20  -cache mode. If 
3c20: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
3c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
3c40: 74 65 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d  ters get out-of-
3c50: 73 79 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73  sync, it is poss
3c60: 69 62 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65  ible for routine
3c70: 73 20 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49  s like.** btreeI
3c80: 6e 69 74 50 61 67 65 28 29 20 74 6f 20 72 65 66  nitPage() to ref
3c90: 65 72 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20  erence an stale 
3ca0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3cb0: 65 72 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  er that referenc
3cc0: 65 73 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63  es a.** a connec
3cd0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c  tion that has al
3ce0: 72 65 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54  ready closed.  T
3cf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3d00: 73 65 64 20 69 6e 73 69 64 65 20 61 73 73 65 72  sed inside asser
3d10: 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
3d20: 73 20 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74  s only and for t
3d30: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f  he purpose of do
3d40: 75 62 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68  uble-checking th
3d50: 61 74 20 74 68 65 20 62 74 72 65 65 20 63 6f 64  at the btree cod
3d60: 65 0a 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74  e.** does keep t
3d70: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
3d80: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  ection pointers 
3d90: 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73  up-to-date..*/.s
3da0: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
3db0: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43  OwnsBtShared(BtC
3dc0: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
3dd0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
3de0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65  Mutex(p) );.  re
3df0: 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d  turn (p->pBtree-
3e00: 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29  >db==p->pBt->db)
3e10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3e20: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3e30: 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20   overflow cache 
3e40: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61  of the cursor pa
3e50: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f  t argument..** o
3e70: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3e80: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3e90: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76  ..*/.#define inv
3ea0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3eb0: 61 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72  ache(pCur) (pCur
3ec0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
3ed0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a  TCF_ValidOvfl)..
3ee0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ef0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3f00: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3f10: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
3f20: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
3f30: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
3f40: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
3f50: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
3f60: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3f70: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
3f80: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
3f90: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
3fa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3fb0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3fc0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
3fd0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
3fe0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
3ff0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
4000: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  e(p);.  }.}..#if
4010: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4020: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
4030: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4040: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
4050: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
4060: 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65  tents of a table
4070: 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  .** to invalidat
4080: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
4090: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
40a0: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
40b0: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
40c0: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
40d0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  fied..**.** If a
40e0: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
40f0: 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68  able is true, th
4100: 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  en the entire co
4110: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
4120: 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20   table is about 
4130: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49  to be deleted. I
4140: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4150: 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62  lidate all incrb
4160: 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  lob.** cursors o
4170: 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77  pen on any row w
4180: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ithin the table 
4190: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70  with root-page p
41a0: 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f  gnoRoot..**.** O
41b0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67  therwise, if arg
41c0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
41d0: 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  le is false, the
41e0: 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a  n the row with.*
41f0: 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20  * rowid iRow is 
4200: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f  being replaced o
4210: 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  r deleted. In th
4220: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4230: 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65  te.** only those
4240: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
4250: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73  s open on that s
4260: 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a  pecific row..*/.
4270: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
4280: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4290: 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a  rsors(.  Btree *
42a0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
42b0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
42c0: 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
42d0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  /.  Pgno pgnoRoo
42e0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
42f0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69  he table that mi
4300: 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20  ght be changing 
4310: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4330: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
4340: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
4350: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
4360: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
4370: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
4380: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4390: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
43a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  rsor *p;.  if( p
43b0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
43c0: 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72  obCur==0 ) retur
43d0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
43e0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
43f0: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4400: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
4410: 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66  blobCur = 0;.  f
4420: 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
4430: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
4440: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
4450: 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  f( (p->curFlags 
4460: 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29  & BTCF_Incrblob)
4470: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
4480: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4490: 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Cur = 1;.      i
44a0: 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
44b0: 70 67 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43  pgnoRoot && (isC
44c0: 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e  learTable || p->
44d0: 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29  info.nKey==iRow)
44e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44f0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
4500: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
4510: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
4520: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
4530: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
4540: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4550: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4560: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4570: 72 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23  rsors(w,x,y,z).#
4580: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4590: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
45a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
45b0: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
45c0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
45d0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
45e0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
45f0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
4600: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
4610: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
4620: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4630: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4640: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4650: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4660: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4670: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4680: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4690: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
46a0: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
46b0: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
46c0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
46d0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
46e0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
46f0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
4700: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
4710: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
4720: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4730: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4740: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4750: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4760: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4770: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4780: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4790: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
47a0: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
47b0: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
47c0: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
47d0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
47e0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
47f0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
4800: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
4810: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
4820: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4830: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4840: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4850: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4860: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4870: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4880: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4890: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
48a0: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
48b0: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
48c0: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
48d0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
48e0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
48f0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
4900: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
4910: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
4920: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4930: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4940: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4950: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4960: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4970: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4980: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4990: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
49a0: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
49b0: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
49c0: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
49d0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
49e0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
49f0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
4a00: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
4a10: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4a20: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4a30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4a40: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4a50: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4a60: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4a70: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4a80: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4a90: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4aa0: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4ab0: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4ac0: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
4ad0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
4ae0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
4af0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
4b00: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
4b10: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
4b20: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4b30: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4b40: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4b50: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4b60: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4b70: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4b80: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4b90: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4ba0: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4bb0: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4bc0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4bd0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
4be0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
4bf0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
4c00: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
4c10: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
4c20: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4c30: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4c40: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4c50: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4c60: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4c70: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4c80: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4c90: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4ca0: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4cb0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4cc0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
4cd0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4ce0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
4cf0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4d00: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
4d10: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
4d20: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4d30: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4d40: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4d50: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4d60: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4d70: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4d80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
4d90: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  T;.    }.  }.  i
4da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4db0: 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65   && pgno<=sqlite
4dc0: 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d  3BitvecSize(pBt-
4dd0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b  >pHasContent) ){
4de0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4df0: 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e  3BitvecSet(pBt->
4e00: 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e  pHasContent, pgn
4e10: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
4e20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75   rc;.}../*.** Qu
4e30: 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64  ery the BtShared
4e40: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63  .pHasContent vec
4e50: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tor..**.** This 
4e60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4e70: 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c  ed when a free-l
4e80: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
4e90: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
4ea0: 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66  e.** free-list f
4eb0: 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74  or reuse. It ret
4ec0: 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74  urns false if it
4ed0: 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72   is safe to retr
4ee0: 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ieve the.** page
4ef0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
4f00: 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
4f10: 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
4f20: 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72   set. True other
4f30: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
4f40: 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43  int btreeGetHasC
4f50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4f60: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
4f70: 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20  {.  Bitvec *p = 
4f80: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4f90: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
4fa0: 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69   (pgno>sqlite3Bi
4fb0: 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73  tvecSize(p) || s
4fc0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4fd0: 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a  (p, pgno)));.}..
4fe0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73  /*.** Clear (des
4ff0: 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72  troy) the BtShar
5000: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
5010: 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75  itvec. This shou
5020: 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ld be.** invoked
5030: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
5040: 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65  on of each write
5050: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f  -transaction..*/
5060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
5070: 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
5080: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
5090: 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
50a0: 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48  cDestroy(pBt->pH
50b0: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42  asContent);.  pB
50c0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
50d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
50e0: 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  ease all of the 
50f0: 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66  apPage[] pages f
5100: 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
5110: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
5120: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5130: 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20  rPages(BtCursor 
5140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
5150: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70  .  for(i=0; i<=p
5160: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
5170: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
5180: 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
5190: 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ]);.    pCur->ap
51a0: 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d  Page[i] = 0;.  }
51b0: 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
51c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
51d0: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
51e0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
51f0: 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  ment must point 
5200: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
5210: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
5220: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
5230: 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61   (i.e. have eSta
5240: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5250: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
5260: 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75  ion saves the cu
5270: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79  rrent cursor key
5280: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43   in variables pC
5290: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20  ur->nKey and.** 
52a0: 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49  pCur->pKey. SQLI
52b0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
52c0: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
52d0: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
52e0: 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  or .** code othe
52f0: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
5300: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
5310: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
5320: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
5330: 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28  integer key.** (
5340: 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74  the rowid) is st
5350: 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b  ored in pCur->nK
5360: 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65  ey and pCur->pKe
5370: 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f  y is left set to
5380: 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65  .** NULL. If the
5390: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
53a0: 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  on a non-intkey 
53b0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72  table, then pCur
53c0: 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65  ->pKey is .** se
53d0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
53e0: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
53f0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
5400: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
5410: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e  ing .** the key.
5420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5430: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43  aveCursorKey(BtC
5440: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5450: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5460: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55  OK;.  assert( CU
5470: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
5480: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5490: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
54a0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
54b0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
54c0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
54d0: 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
54e0: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  y ){.    /* Only
54f0: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65   the rowid is re
5500: 71 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62  quired for a tab
5510: 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  le btree */.    
5520: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
5530: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
5540: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  Key(pCur);.  }el
5550: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
5560: 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73  n index btree, s
5570: 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ave the complete
5580: 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   key content */.
5590: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
55a0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
55b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55c0: 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
55d0: 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
55e0: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
55f0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
5600: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
5610: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5620: 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
5630: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
5640: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5650: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5660: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5670: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5690: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
56a0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
56b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
56d0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
56e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
56f0: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
5700: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  !pCur->pKey );. 
5710: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5720: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
5730: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5740: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
5750: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
5760: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
5770: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
5780: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
5790: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
57a0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
57b0: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
57c0: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
57d0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
57e0: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
57f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
5800: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
5810: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
5820: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
5830: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5840: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5850: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
5860: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
5870: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
5880: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5890: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
58a0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
58b0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
58c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
58d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
58e0: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
58f0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5900: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5910: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5920: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
5930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
5940: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
5950: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76  .  }..  rc = sav
5960: 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29  eCursorKey(pCur)
5970: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5980: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
5990: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
59a0: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
59b0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
59c0: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
59d0: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  SEEK;.  }..  pCu
59e0: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
59f0: 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
5a00: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
5a10: 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72  TCF_AtLast);.  r
5a20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5a30: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5a40: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5a50: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5a60: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5a70: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
5a80: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
5a90: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
5aa0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
5ab0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
5ac0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5ad0: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5ae0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5af0: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5b00: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5b10: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5b20: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5b30: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5b40: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5b50: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5b60: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
5b70: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
5b80: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
5b90: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
5ba0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
5bb0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
5bc0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5bd0: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5be0: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5bf0: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5c00: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5c10: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5c20: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5c30: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
5c40: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
5c50: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
5c60: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
5c70: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
5c80: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
5c90: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
5ca0: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5cb0: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
5cc0: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
5cd0: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
5ce0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
5cf0: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
5d00: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
5d10: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
5d20: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
5d30: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
5d40: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
5d50: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
5d60: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
5d70: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
5d80: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
5d90: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
5da0: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
5db0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
5dc0: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
5dd0: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
5de0: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
5df0: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
5e00: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
5e10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
5e20: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
5e30: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
5e40: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
5e50: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
5e60: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
5e70: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
5e80: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
5e90: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
5ea0: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
5eb0: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
5ec0: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
5ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ee0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
5ef0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5f00: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
5f10: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
5f20: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
5f30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5f40: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5f50: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
5f60: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
5f70: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
5f80: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
5f90: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
5fa0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
5fb0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
5fc0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
5fd0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
5fe0: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
5ff0: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
6000: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
6010: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
6020: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
6030: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
6040: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
6050: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
6060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6070: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
6080: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
6090: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
60a0: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
60b0: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
60c0: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
60d0: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
60e0: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
60f0: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
6100: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
6110: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
6120: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
6130: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
6140: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
6150: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
6160: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
6170: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
6180: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
6190: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
61a0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
61b0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
61c0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
61d0: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
61e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
61f0: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
6200: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
6210: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
6220: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
6230: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
6240: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
6250: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
6260: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
6270: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
6280: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
6290: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
62a0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
62b0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
62c0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
62d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
62e0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
62f0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
6300: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
6310: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
6320: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
6330: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
6340: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
6350: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
6360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
6370: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6390: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
63a0: 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Page>=0 );.     
63b0: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
63c0: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
63d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
63e0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
63f0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b  ;.  }while( p );
6400: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6410: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
6420: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
6430: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
6440: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6450: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
6460: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
6470: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
6480: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
6490: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
64a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
64b0: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
64c0: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
64d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
64e0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
64f0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
6500: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
6510: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
6520: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
6530: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
6540: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
6550: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
6560: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
6570: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
6580: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
6590: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
65a0: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
65b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
65c0: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
65d0: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
65e0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
65f0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
6600: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
6610: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
6620: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
6630: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
6640: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
6650: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
6660: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
6670: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
6680: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
6690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
66a0: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
66b0: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
66c0: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
66d0: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
66e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
66f0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
6700: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
6710: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6720: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
6730: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
6740: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
6750: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
6760: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20   index key */.. 
6770: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
6780: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
6790: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
67a0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
67b0: 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
67c0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43  npackedRecord(pC
67d0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ur->pKeyInfo);. 
67e0: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
67f0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
6800: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
6810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
6820: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
6830: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
6840: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
6850: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
6860: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
6870: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6880: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
6890: 4f 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  O(pCur->apPage[p
68a0: 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
68b0: 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  o);.      goto m
68c0: 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20  oveto_done;.    
68d0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
68e0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
68f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6900: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6910: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6920: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6930: 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a  s);.moveto_done:
6940: 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
6950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
6960: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
6970: 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29  fo->db, pIdxKey)
6980: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6990: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
69a0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
69b0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
69c0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
69d0: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
69e0: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
69f0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6a00: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6a10: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6a20: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6a30: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6a40: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6a50: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6a60: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
6a70: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
6a80: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
6a90: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6aa0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
6ab0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
6ac0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6ae0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6af0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6b00: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6b10: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6b20: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6b30: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
6b40: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
6b50: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6b60: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6b70: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
6b80: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6b90: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
6ba0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
6bb0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
6bc0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6bd0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
6be0: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
6bf0: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
6c00: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
6c10: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
6c20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6c30: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c40: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
6c50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
6c60: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
6c70: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
6c80: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6c90: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6ca0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
6cb0: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
6cc0: 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b  ext |= skipNext;
6cd0: 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
6ce0: 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d  kipNext && pCur-
6cf0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6d00: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70  VALID ){.      p
6d10: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
6d20: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
6d30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6d40: 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65  n rc;.}..#define
6d50: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6d60: 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70  sition(p) \.  (p
6d70: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6d80: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c  _REQUIRESEEK ? \
6d90: 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52  .         btreeR
6da0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6db0: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
6dc0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
6dd0: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
6de0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6df0: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
6e00: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
6e10: 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74  tion where.** it
6e20: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6e30: 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e  , or has been in
6e40: 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e  validated for an
6e50: 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a  y other reason..
6e60: 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  ** Cursors can m
6e70: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
6e80: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
6e90: 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ng at is deleted
6ea0: 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64   out.** from und
6eb0: 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61  er them, for exa
6ec0: 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69  mple.  Cursor mi
6ed0: 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66  ght also move if
6ee0: 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72   a btree.** is r
6ef0: 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  ebalanced..**.**
6f00: 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
6f10: 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c  utine with a NUL
6f20: 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72  L cursor pointer
6f30: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a   returns false..
6f40: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65  **.** Use the se
6f50: 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74  parate sqlite3Bt
6f60: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
6f70: 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65  () routine to re
6f80: 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a  store a cursor.*
6f90: 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20  * back to where 
6fa0: 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69  it ought to be i
6fb0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
6fc0: 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a  eturns true..*/.
6fd0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
6fe0: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
6ff0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
7000: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
7010: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7020: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LID;.}../*.** Th
7030: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f  is routine resto
7040: 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63  res a cursor bac
7050: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
7060: 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72  l position after
7070: 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20   it.** has been 
7080: 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75  moved by some ou
7090: 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28  tside activity (
70a0: 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20  such as a btree 
70b0: 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20  rebalance or.** 
70c0: 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65  a row having bee
70d0: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
70e0: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
70f0: 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e  sor).  .**.** On
7100: 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70   success, the *p
7110: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72  DifferentRow par
7120: 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20  ameter is false 
7130: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
7140: 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e   left.** pointin
7150: 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65  g at exactly the
7160: 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69   same row.  *pDi
7170: 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65  fferntRow is the
7180: 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a   row the cursor.
7190: 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20  ** was pointing 
71a0: 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  to has been dele
71b0: 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65  ted, forcing the
71c0: 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
71d0: 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72   to some.** near
71e0: 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68  by row..**.** Th
71f0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
7200: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
7210: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
7220: 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64  at just returned
7230: 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71  .** TRUE from sq
7240: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7250: 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69  HasMoved()..*/.i
7260: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
7270: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43  ursorRestore(BtC
7280: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
7290: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29   *pDifferentRow)
72a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
72b0: 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
72c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
72d0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
72e0: 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
72f0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
7300: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
7310: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
7320: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7330: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
7340: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
7350: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
7360: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44  VALID ){.    *pD
7370: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b  ifferentRow = 1;
7380: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
7390: 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
73a0: 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Next==0 );.    *
73b0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
73c0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
73d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
73e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
73f0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7400: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7410: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7420: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7430: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7440: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7450: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7460: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7470: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
7480: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
7490: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
74a0: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
74b0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
74c0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
74d0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
74e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
74f0: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7500: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7510: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7520: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7530: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7540: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7550: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7560: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7570: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
7580: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
7590: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
75a0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
75b0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
75c0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
75d0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
75e0: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
75f0: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7600: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7610: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7620: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7640: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7650: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7660: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7670: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
7680: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
7690: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
76a0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
76b0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
76c0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
76d0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
76e0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
76f0: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7700: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7710: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7720: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7730: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7740: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7750: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7760: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
7770: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
7780: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
7790: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
77a0: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
77b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
77c0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
77d0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
77e0: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
77f0: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
7800: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7810: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7820: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
7830: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7840: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
7850: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
7860: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
7870: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
7880: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
7890: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
78a0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
78b0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
78c0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
78d0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
78e0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
78f0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
7900: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
7910: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
7920: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
7930: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
7940: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
7950: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7960: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
7970: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
7980: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
7990: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
79a0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
79b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
79c0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
79d0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
79e0: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
79f0: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
7a00: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
7a10: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
7a20: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
7a30: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
7a40: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
7a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7a60: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
7a70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7a80: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
7a90: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
7aa0: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
7ab0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
7ac0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7ad0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
7ae0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
7af0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
7b00: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
7b10: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
7b20: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
7b30: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
7b40: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
7b50: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
7b60: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
7b70: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7b80: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7b90: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
7ba0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
7bb0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
7bc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7bd0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7be0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
7bf0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7c00: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
7c10: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
7c20: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
7c30: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
7c40: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
7c50: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
7c60: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
7c70: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
7c80: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
7c90: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
7ca0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7cb0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7cc0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7cd0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7ce0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7cf0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7d00: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7d10: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7d20: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
7d30: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7d40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
7d50: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
7d60: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
7d70: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
7d80: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
7d90: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
7da0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
7db0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7dc0: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
7dd0: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
7de0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
7df0: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
7e00: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50  leSize-5 );.  pP
7e10: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
7e20: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7e30: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
7e40: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
7e50: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
7e60: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7e70: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
7e80: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
7e90: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
7ea0: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
7eb0: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
7ec0: 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20  nt));.    *pRC= 
7ed0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7ee0: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
7ef0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7f00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7f10: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
7f20: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
7f30: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
7f40: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
7f50: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
7f60: 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73  ptrmap_exit:.  s
7f70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7f80: 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  (pDbPage);.}../*
7f90: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
7fa0: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
7fb0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7fc0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
7fd0: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
7fe0: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
7ff0: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
8000: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
8010: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
8020: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
8030: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
8040: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
8050: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
8060: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
8070: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
8080: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
8090: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
80a0: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
80b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
80c0: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
80d0: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
80e0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
80f0: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
8100: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8110: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
8120: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8130: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
8140: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
8150: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
8160: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
8170: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
8180: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8190: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
81a0: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
81b0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  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 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
81f0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
8200: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
8210: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8220: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
8230: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8240: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
8250: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8260: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
8270: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
8280: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
8290: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
82a0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
82b0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
82c0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
82d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
82e0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
82f0: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
8300: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8310: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
8320: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
8330: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
8340: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
8350: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
8360: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
8370: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
8380: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
8390: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
83a0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
83b0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
83c0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
83d0: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
83e0: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
83f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8400: 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70  UPT_PGNO(iPtrmap
8410: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
8420: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
8430: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
8440: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8450: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
8460: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
8470: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
8480: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
8490: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
84a0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
84b0: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
84c0: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
84d0: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
84e0: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
84f0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
8500: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
8510: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
8520: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
8530: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
8540: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8550: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8560: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8570: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
8580: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
8590: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
85a0: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
85b0: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
85c0: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
85d0: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
85e0: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
85f0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
8600: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
8610: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
8620: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
8630: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
8640: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
8650: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
8660: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
8670: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8680: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8690: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
86a0: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
86b0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
86c0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
86d0: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
86e0: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
86f0: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
8700: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
8710: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
8720: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
8730: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
8740: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8750: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
8760: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8770: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
8780: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
8790: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
87a0: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
87b0: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
87c0: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
87d0: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
87e0: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
87f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
8800: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
8810: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
8820: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
8830: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
8840: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8850: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8860: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8870: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8880: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8890: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
88a0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
88b0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
88c0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
88d0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
88e0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
88f0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
8900: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
8910: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
8920: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
8930: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
8940: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8950: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8960: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8970: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
8980: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
8990: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
89a0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
89b0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
89c0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
89d0: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
89e0: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
89f0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
8a00: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
8a10: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
8a20: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
8a30: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
8a40: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8a50: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8a60: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8a70: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
8a80: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
8a90: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
8aa0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
8ab0: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
8ac0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
8ad0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
8ae0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
8af0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
8b00: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
8b10: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
8b20: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
8b30: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
8b40: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
8b50: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
8b60: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
8b70: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
8b80: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8b90: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
8ba0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8bb0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
8bc0: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
8bd0: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
8be0: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
8bf0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
8c00: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8c10: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
8c20: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8c30: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8c40: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
8c50: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
8c60: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8c70: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
8c80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8c90: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8ca0: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8cb0: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
8cc0: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8cd0: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8ce0: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8cf0: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
8d00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
8d10: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
8d20: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
8d30: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
8d40: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
8d50: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8d60: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8d70: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8d80: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8d90: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8da0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8db0: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8dc0: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8dd0: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8de0: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8df0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
8e00: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
8e10: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8e20: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
8e30: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
8e40: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
8e50: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8e60: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8e70: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8e80: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8e90: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8ea0: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8eb0: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8ec0: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8ed0: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8ee0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8ef0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8f00: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
8f10: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8f30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8f40: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8f50: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8f60: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8f70: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8f80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8f90: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8fa0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8fb0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8fc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8fd0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8fe0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8ff0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9000: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
9010: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9020: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
9030: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
9040: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
9050: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
9060: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
9070: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
9080: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
9090: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
90a0: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
90b0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
90c0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
90d0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
90e0: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
90f0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
9100: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
9110: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
9120: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9130: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9140: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9150: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9160: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9170: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9180: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9190: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
91a0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
91b0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
91c0: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
91d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
91e0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
91f0: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
9200: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
9210: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9220: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
9230: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
9240: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
9250: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
9260: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
9270: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9280: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9290: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
92a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
92b0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
92c0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
92d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
92e0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
92f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9300: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
9310: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
9320: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
9330: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
9340: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9350: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9360: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9370: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
9380: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
9390: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
93a0: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
93b0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
93c0: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
93d0: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
93e0: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
93f0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9400: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9410: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
9420: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
9430: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
9440: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9450: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9460: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
9470: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9480: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9490: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
94a0: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
94b0: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
94c0: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
94d0: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
94e0: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
94f0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
9500: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
9510: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
9520: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
9530: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
9540: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
9550: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
9560: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
9570: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
9580: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
9590: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
95a0: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
95b0: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
95c0: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
95d0: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
95e0: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
95f0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
9600: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
9610: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
9620: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
9630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9640: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9650: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
9660: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
9670: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
9680: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
9690: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
96a0: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
96b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
96c0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
96d0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
96e0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
96f0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
9700: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
9710: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
9720: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
9730: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
9740: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
9750: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
9760: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
9770: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
9780: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
9790: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
97a0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
97b0: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
97c0: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
97d0: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
97e0: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
97f0: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
9800: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
9810: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
9820: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
9830: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
9840: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9850: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9860: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9870: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9880: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9890: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
98a0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
98b0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
98c0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
98d0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98f0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9900: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
9910: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9920: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9930: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9940: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
9950: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9960: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9970: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9980: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9990: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
99a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
99b0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
99c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
99d0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
99e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
99f0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9a00: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
9a10: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
9a20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9a30: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
9a40: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
9a50: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9a60: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
9a70: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
9a80: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9a90: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9aa0: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9ab0: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9ac0: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9ad0: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9ae0: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
9af0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9b00: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9b10: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
9b20: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
9b30: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
9b40: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9b50: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9b60: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9b70: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9b80: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9b90: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9ba0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9bb0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9bc0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9bd0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9be0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9bf0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9c00: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9c10: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9c20: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9c30: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9c40: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9c50: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9c60: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9c70: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9c80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9c90: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9ca0: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9cb0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9cc0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9cd0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9ce0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9cf0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9d00: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9d10: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9d20: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9d30: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9d40: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9d50: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9d60: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9d70: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
9d80: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9d90: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9da0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9db0: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9dd0: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
9de0: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
9df0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9e10: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9e20: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
9e30: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
9e40: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9e50: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9e60: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
9e70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
9e80: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
9e90: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
9ea0: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
9eb0: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
9ec0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
9ed0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
9ee0: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
9ef0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
9f00: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
9f10: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
9f20: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
9f30: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
9f40: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
9f50: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
9f60: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
9f70: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
9f80: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
9f90: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
9fa0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
9fb0: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
9fc0: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
9fd0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
9fe0: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
9ff0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
a000: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
a010: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
a020: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
a030: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
a040: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
a050: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a060: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
a070: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a080: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a090: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
a0a0: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
a0b0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
a0c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
a0f0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
a100: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
a130: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
a140: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a150: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
a160: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
a170: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a180: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
a190: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
a1a0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
a1b0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
a1c0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
a1d0: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
a1e0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
a1f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
a200: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
a210: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
a220: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
a230: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
a240: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
a250: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
a260: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
a270: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
a280: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
a290: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
a2a0: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
a2b0: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
a2c0: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a2d0: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
a2e0: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a2f0: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
a300: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
a310: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
a320: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
a330: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a340: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a350: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a360: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a370: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
a380: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
a390: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
a3a0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
a3b0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
a3c0: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
a3d0: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
a3e0: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
a3f0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
a400: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
a410: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
a420: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
a430: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
a440: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
a450: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a460: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
a470: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a480: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a490: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
a4a0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a4b0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
a4c0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a4d0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a4e0: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
a4f0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a500: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
a510: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
a520: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
a530: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
a540: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
a550: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
a560: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a570: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a580: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
a590: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
a5a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a5b0: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
a5c0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a5d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a5e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a5f0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a600: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
a610: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
a620: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a630: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a640: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
a650: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
a660: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a670: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a680: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
a690: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
a6a0: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
a6b0: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
a6c0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a6d0: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
a6e0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a6f0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
a700: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
a710: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
a720: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a730: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a740: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a750: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a760: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
a770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a780: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a790: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a7a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a7b0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a7c0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a7d0: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a7e0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a7f0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a800: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a810: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a820: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a830: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a840: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a850: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a860: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a870: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a880: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a890: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a8a0: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a8b0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a8c0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a8d0: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
a8e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a8f0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
a900: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
a910: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a920: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
a930: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
a940: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*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 61 73 73 65 72 74 28 20 64  d );.  assert( d
a970: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
a980: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a990: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
a9a0: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a9b0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a9c0: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
a9d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
a9e0: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
a9f0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
aa00: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
aa10: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
aa20: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
aa30: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
aa40: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
aa50: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
aa60: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
aa70: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
aa80: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
aa90: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
aaa0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
aab0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
aac0: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
aad0: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
aae0: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
aaf0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
ab00: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
ab10: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
ab20: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
ab30: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
ab40: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
ab50: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
ab60: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
ab70: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
ab80: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
ab90: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
aba0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
abb0: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
abc0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
abd0: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70   pCell!=0 );.  p
abe0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
abf0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
ac00: 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
ac10: 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
ac20: 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67  ayload ){.    Pg
ac30: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
ac40: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  te(&pCell[info.n
ac50: 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74  Size-4]);.    pt
ac60: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
ac70: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
ac80: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
ac90: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
aca0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
acb0: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
acc0: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 54  he page given. T
acd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f 72  his routine reor
ace0: 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77 69  ganizes cells wi
acf0: 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  thin the.** page
ad00: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61   so that there a
ad10: 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b  re no free-block
ad20: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62 6c  s on the free-bl
ad30: 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ock list..**.** 
ad40: 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46 72  Parameter nMaxFr
ad50: 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ag is the maximu
ad60: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67  m amount of frag
ad70: 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68 61  mented space tha
ad80: 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65 73  t may be.** pres
ad90: 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  ent in the page 
ada0: 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  after this routi
adb0: 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  ne returns..**.*
adc0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
add0: 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c  -44582-60138 SQL
ade0: 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d  ite may from tim
adf0: 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61  e to time reorga
ae00: 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65  nize a.** b-tree
ae10: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
ae20: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62  ere are no freeb
ae30: 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e  locks or fragmen
ae40: 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20  t bytes, all.** 
ae50: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65  unused bytes are
ae60: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
ae70: 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70  e unallocated sp
ae80: 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20  ace region, and 
ae90: 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65  all.** cells are
aea0: 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20   packed tightly 
aeb0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
aec0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
aed0: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
aee0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
aef0: 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61  age, int nMaxFra
af00: 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  g){.  int i;    
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
af30: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
af60: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a  he i-th cell */.
af70: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af90: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
afa0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
afb0: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
afc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
afd0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
afe0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b000: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
b010: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
b020: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
b030: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
b040: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
b050: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
b060: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
b070: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
b080: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b090: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b0a0: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
b0b0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
b0c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b0d0: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
b0e0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
b0f0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
b100: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
b110: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
b120: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
b130: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
b140: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
b150: 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  tent */.  unsign
b160: 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20  ed char *src;   
b170: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f       /* Source o
b180: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
b190: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b1b0: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
b1c0: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
b1d0: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
b1e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
b1f0: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e  possible cell in
b200: 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dex */..  assert
b210: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
b220: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
b230: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b240: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b250: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b260: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
b270: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
b280: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
b290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b2a0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
b2b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b2c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b2d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
b2e0: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
b2f0: 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61   0;.  src = data
b300: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b310: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
b320: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
b330: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
b340: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
b350: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
b360: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
b370: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
b380: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
b390: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
b3a0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
b3b0: 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ell;.  usableSiz
b3c0: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
b3d0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f  usableSize;..  /
b3e0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e  * This block han
b3f0: 64 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20  dles pages with 
b400: 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65  two or fewer fre
b410: 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61  e blocks and nMa
b420: 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65  xFrag.  ** or fe
b430: 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62  wer fragmented b
b440: 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61  ytes. In this ca
b450: 73 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20  se it is faster 
b460: 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a  to move the.  **
b470: 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c   two (or one) bl
b480: 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73  ocks of cells us
b490: 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e  ing memmove() an
b4a0: 64 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72  d add the requir
b4b0: 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20  ed.  ** offsets 
b4c0: 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20  to each pointer 
b4d0: 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  in the cell-poin
b4e0: 74 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69  ter array than i
b4f0: 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65  t is to .  ** re
b500: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e  construct the en
b510: 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tire page.  */. 
b520: 20 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68   if( (int)data[h
b530: 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20  dr+7]<=nMaxFrag 
b540: 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65  ){.    int iFree
b550: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b560: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69  a[hdr+1]);.    i
b570: 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20  f( iFree ){.    
b580: 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67    int iFree2 = g
b590: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
b5a0: 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ree]);..      /*
b5b0: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20   pageFindSlot() 
b5c0: 68 61 73 20 61 6c 72 65 61 64 79 20 76 65 72 69  has already veri
b5d0: 66 69 65 64 20 74 68 61 74 20 66 72 65 65 20 62  fied that free b
b5e0: 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65 64  locks are sorted
b5f0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64  .      ** in ord
b600: 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69 74  er of offset wit
b610: 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61 6e  hin the page, an
b620: 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20  d that no block 
b630: 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a  extends.      **
b640: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b650: 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76 69   the page. Provi
b660: 64 65 64 20 74 68 65 20 74 77 6f 20 66 72 65 65  ded the two free
b670: 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20   slots do not . 
b680: 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c       ** overlap,
b690: 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   this guarantees
b6a0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76   that the memmov
b6b0: 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20  e() calls below 
b6c0: 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a  will not.      *
b6d0: 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  * overwrite the 
b6e0: 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65 20  usableSize byte 
b6f0: 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66 20  buffer, even if 
b700: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
b710: 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f  e.      ** is co
b720: 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20  rrupt.  */.     
b730: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d   assert( iFree2=
b740: 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46 72  =0 || iFree2>iFr
b750: 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ee );.      asse
b760: 72 74 28 20 69 46 72 65 65 2b 67 65 74 32 62 79  rt( iFree+get2by
b770: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32  te(&data[iFree+2
b780: 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  ]) <= usableSize
b790: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b7a0: 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69  ( iFree2==0 || i
b7b0: 46 72 65 65 32 2b 67 65 74 32 62 79 74 65 28 26  Free2+get2byte(&
b7c0: 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 20  data[iFree2+2]) 
b7d0: 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  <= usableSize );
b7e0: 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69  ..      if( 0==i
b7f0: 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69  Free2 || (data[i
b800: 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74  Free2]==0 && dat
b810: 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20  a[iFree2+1]==0) 
b820: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
b830: 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  End = &data[cell
b840: 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
b850: 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ];.        u8 *p
b860: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Addr;.        in
b870: 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20  t sz2 = 0;.     
b880: 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32     int sz = get2
b890: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
b8a0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  +2]);.        in
b8b0: 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65  t top = get2byte
b8c0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
b8d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
b8e0: 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e2 ){.          
b8f0: 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72  if( iFree+sz>iFr
b900: 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ee2 ) return SQL
b910: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
b920: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
b930: 20 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67           sz2 = g
b940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
b950: 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ree2+2]);.      
b960: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
b970: 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d  e+sz+sz2+iFree2-
b980: 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73  (iFree+sz) <= us
b990: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
b9a0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
b9b0: 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32  ata[iFree+sz+sz2
b9c0: 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73  ], &data[iFree+s
b9d0: 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65  z], iFree2-(iFre
b9e0: 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20  e+sz));.        
b9f0: 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20    sz += sz2;.   
ba00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
ba10: 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20  brk = top+sz;.  
ba20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 62        assert( cb
ba30: 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c  rk+(iFree-top) <
ba40: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
ba50: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
ba60: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61  &data[cbrk], &da
ba70: 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74  ta[top], iFree-t
ba80: 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  op);.        for
ba90: 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c  (pAddr=&data[cel
baa0: 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c  lOffset]; pAddr<
bab0: 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b  pEnd; pAddr+=2){
bac0: 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
bad0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
bae0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
baf0: 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32 62  c<iFree ){ put2b
bb00: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
bb10: 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65  ); }.          e
bb20: 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72 65 65  lse if( pc<iFree
bb30: 32 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41  2 ){ put2byte(pA
bb40: 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a  ddr, pc+sz2); }.
bb50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bb60: 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e    goto defragmen
bb70: 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  t_out;.      }. 
bb80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b     }.  }..  cbrk
bb90: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
bba0: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
bbb0: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
bbc0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
bbd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
bbe0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
bbf0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
bc00: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
bc10: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
bc20: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
bc30: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
bc40: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
bc50: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
bc60: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
bc70: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bc80: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65   );.    /* These
bc90: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
bca0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
bcb0: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
bcc0: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
bcd0: 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f   if PRAGMA cell_
bce0: 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20  size_check=ON.. 
bcf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
bd00: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bd10: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bd20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bd30: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
bd40: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
bd50: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
bd60: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
bd70: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
bd80: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
bd90: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
bda0: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
bdb0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
bdc0: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
bdd0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
bde0: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
bdf0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
be00: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be10: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
be20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
be30: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
be40: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
be50: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
be60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
be70: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
be80: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
be90: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
bea0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
beb0: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
bec0: 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  , cbrk);.    if(
bed0: 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20   temp==0 ){.    
bee0: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
bef0: 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f  f( cbrk==pc ) co
bf00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65  ntinue;.      te
bf10: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
bf20: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
bf30: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
bf40: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
bf50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
bf60: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
bf70: 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78  temp[x], &data[x
bf80: 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d  ], (cbrk+size) -
bf90: 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d   x);.      src =
bfa0: 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20   temp;.    }.   
bfb0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
bfc0: 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73  rk], &src[pc], s
bfd0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  ize);.  }.  data
bfe0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64  [hdr+7] = 0;.. d
bff0: 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20  efragment_out:. 
c000: 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d   if( data[hdr+7]
c010: 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74  +cbrk-iCellFirst
c020: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
c030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c040: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
c050: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
c060: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
c070: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
c080: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
c090: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
c0a0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
c0b0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
c0c0: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
c0d0: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
c0e0: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
c0f0: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
c100: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
c110: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
c120: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
c130: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
c150: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f   the free-list o
c160: 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73  n page pPg for s
c170: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
c180: 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73  cell nByte bytes
c190: 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20   in.** size. If 
c1a0: 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
c1b0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
c1c0: 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20  er to the space 
c1d0: 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a  and remove it.**
c1e0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
c1f0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ist..**.** If no
c200: 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20   suitable space 
c210: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20  can be found on 
c220: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72  the free-list, r
c230: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
c240: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c250: 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75  may detect corru
c260: 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67  ption within pPg
c270: 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e  .  If corruption
c280: 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20   is.** detected 
c290: 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74  then *pRc is set
c2a0: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   to SQLITE_CORRU
c2b0: 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  PT and NULL is r
c2c0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
c2d0: 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65  lots on the free
c2e0: 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62   list that are b
c2f0: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62  etween 1 and 3 b
c300: 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ytes larger than
c310: 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62   nByte.** will b
c320: 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64  e ignored if add
c330: 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70  ing the extra sp
c340: 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d  ace to the fragm
c350: 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a  entation count.*
c360: 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61  * causes the fra
c370: 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74  gmentation count
c380: 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a   to exceed 60..*
c390: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
c3a0: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
c3b0: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
c3c0: 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  e, int *pRc){.  
c3d0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
c3e0: 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
c3f0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
c400: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
c410: 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68  .  int iAddr = h
c420: 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63  dr + 1;.  int pc
c430: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
c440: 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e  ta[iAddr]);.  in
c450: 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  t x;.  int usabl
c460: 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
c470: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
c480: 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b   assert( pc>0 );
c490: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73  .  do{.    int s
c4a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
c4b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
c4c0: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
c4d0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
c4e0: 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72  R-06866-39125 Fr
c4f0: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77  eeblocks are alw
c500: 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e  ays connected in
c510: 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a   order of.    **
c520: 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73   increasing offs
c530: 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  et. */.    if( p
c540: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
c550: 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a  | pc<iAddr+4 ){.
c560: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
c570: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
c580: 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  (pPg->pgno);.   
c590: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c5a0: 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
c5b0: 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35  CE-OF: R-22710-5
c5c0: 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61  3328 The third a
c5d0: 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20  nd fourth bytes 
c5e0: 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66  of each.    ** f
c5f0: 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20  reeblock form a 
c600: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
c610: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c620: 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  size of the free
c630: 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20  block.    ** in 
c640: 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67  bytes, including
c650: 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64   the 4-byte head
c660: 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20  er. */.    size 
c670: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
c680: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66  a[pc+2]);.    if
c690: 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  ( (x = size - nB
c6a0: 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  yte)>=0 ){.     
c6b0: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20   testcase( x==4 
c6c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
c6d0: 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20  e( x==3 );.     
c6e0: 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63   if( pc < pPg->c
c6f0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d  ellOffset+2*pPg-
c700: 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70  >nCell || size+p
c710: 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29  c > usableSize )
c720: 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d  {.        *pRc =
c730: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c740: 50 47 4e 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b  PGNO(pPg->pgno);
c750: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c760: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
c770: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
c780: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
c790: 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20  : R-11498-58022 
c7a0: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
c7b0: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
c7c0: 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20  e total.        
c7d0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
c7e0: 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20  es in fragments 
c7f0: 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36  may not exceed 6
c800: 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  0. */.        if
c810: 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35  ( aData[hdr+7]>5
c820: 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  7 ) return 0;.. 
c830: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
c840: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
c850: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
c860: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
c870: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
c880: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
c890: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
c8a0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
c8b0: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
c8c0: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
c8d0: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
c8e0: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
c8f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c900: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
c910: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
c920: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
c930: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
c940: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a  count.         *
c950: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
c960: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
c970: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
c980: 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74  .        put2byt
c990: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20  e(&aData[pc+2], 
c9a0: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
c9b0: 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b    return &aData[
c9c0: 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20  pc + x];.    }. 
c9d0: 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20     iAddr = pc;. 
c9e0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c9f0: 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20  (&aData[pc]);.  
ca00: 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20  }while( pc );.. 
ca10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ca20: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
ca30: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
ca40: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
ca50: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
ca60: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
ca70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
ca80: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
ca90: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
caa0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
cab0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
cac0: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
cad0: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
cae0: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
caf0: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
cb00: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
cb10: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
cb20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
cb30: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
cb40: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
cb50: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
cb60: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
cb70: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
cb80: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
cb90: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
cba0: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
cbb0: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
cbc0: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
cbd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
cbe0: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
cbf0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
cc00: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
cc10: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
cc20: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
cc30: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
cc40: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
cc50: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
cc60: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
cc70: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
cc80: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
cc90: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
cca0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
ccb0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
ccc0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ccd0: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
cce0: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
ccf0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
cd00: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
cd10: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
cd20: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
cd30: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
cd40: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
cd50: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
cd60: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
cd70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
cd80: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
cdb0: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
cdc0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
cdd0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cde0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
cdf0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
ce00: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
ce10: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
ce20: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ce30: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
ce40: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
ce50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
ce60: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
ce70: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
ce80: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ce90: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
cea0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
ceb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cec0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ced0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
cee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
cef0: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
cf00: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
cf10: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
cf20: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
cf30: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
cf40: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
cf50: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
cf60: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
cf70: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
cf80: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
cf90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cfa0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
cfb0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
cfc0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
cfd0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
cfe0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
cff0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
d000: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
d010: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
d020: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
d030: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
d040: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
d050: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
d060: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
d070: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
d080: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
d090: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
d0a0: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
d0b0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
d0c0: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
d0d0: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
d0e0: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
d0f0: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
d100: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
d110: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
d120: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
d130: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
d140: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
d150: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
d160: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
d170: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d180: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
d190: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
d1a0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d1b0: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
d1c0: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
d1d0: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
d1e0: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
d1f0: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
d200: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d210: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
d220: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
d230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d250: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
d260: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  ge->pgno);.    }
d270: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d280: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
d290: 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20  ace between gap 
d2a0: 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20  and top for one 
d2b0: 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65  more cell pointe
d2c0: 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74  r.  ** array ent
d2d0: 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69  ry offset, and i
d2e0: 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  f the freelist i
d2f0: 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65  s not empty, the
d300: 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a  n search the.  *
d310: 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  * freelist looki
d320: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
d330: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
d340: 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71   satisfy the req
d350: 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  uest..  */.  tes
d360: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
d370: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
d380: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
d390: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
d3a0: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61  top );.  if( (da
d3b0: 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74  ta[hdr+2] || dat
d3c0: 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70  a[hdr+1]) && gap
d3d0: 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75  +2<=top ){.    u
d3e0: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
d3f0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
d400: 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20  nByte, &rc);.   
d410: 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20   if( pSpace ){. 
d420: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 70       assert( pSp
d430: 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53  ace>=data && (pS
d440: 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35  pace - data)<655
d450: 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64  36 );.      *pId
d460: 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65  x = (int)(pSpace
d470: 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20   - data);.      
d480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d490: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d4a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
d4b0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
d4c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65  ..  /* The reque
d4d0: 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  st could not be 
d4e0: 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  fulfilled using 
d4f0: 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e  a freelist slot.
d500: 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20    Check.  ** to 
d510: 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e  see if defragmen
d520: 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  tation is necess
d530: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ary..  */.  test
d540: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
d550: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
d560: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
d570: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d580: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
d590: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
d5a0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
d5b0: 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49  ntPage(pPage, MI
d5c0: 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65  N(4, pPage->nFre
d5d0: 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b  e - (2+nByte)));
d5e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
d5f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
d600: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
d610: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
d620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
d630: 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  p+2+nByte<=top )
d640: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
d650: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
d660: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
d670: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
d680: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
d690: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
d6a0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
d6b0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
d6c0: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
d6d0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
d6e0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
d6f0: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
d700: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
d710: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
d720: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
d730: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
d740: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
d750: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
d760: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
d770: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
d780: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
d790: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
d7a0: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
d7b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d7c0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
d7d0: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
d7e0: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
d7f0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
d800: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
d810: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d820: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
d830: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
d840: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
d850: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
d860: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
d870: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
d880: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
d890: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
d8a0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
d8b0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
d8c0: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
d8d0: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
d8e0: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
d8f0: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
d900: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
d910: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
d920: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
d930: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
d940: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
d950: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
d960: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
d970: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
d980: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
d990: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
d9a0: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
d9b0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
d9c0: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
d9d0: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
d9e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d9f0: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
da00: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
da10: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
da20: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
da30: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
da40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
da50: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
da60: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
da70: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
da80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
da90: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
daa0: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
dab0: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
dae0: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
daf0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
db00: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
db30: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
db40: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
db70: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
db80: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
db90: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
dbc0: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
dbd0: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
dbe0: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc00: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
dc10: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
dc20: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
dc30: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
dc40: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
dc50: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
dc60: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
dc70: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
dc80: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
dc90: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
dca0: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
dcb0: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
dcc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
dcd0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
dce0: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
dcf0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
dd00: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
dd10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
dd20: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
dd30: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
dd40: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
dd50: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
dd60: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
dd70: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
dd80: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
dd90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
dda0: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
ddb0: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
ddc0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
ddd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
dde0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ddf0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
de00: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
de10: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
de20: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
de30: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
de40: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
de50: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
de60: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
de70: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
de80: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
de90: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
dea0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
deb0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
dec0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
ded0: 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a  _FAST_SECURE ){.
dee0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
def0: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
df00: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
df10: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
df20: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
df30: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
df40: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
df50: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
df60: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
df70: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
df80: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
df90: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
dfa0: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
dfb0: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
dfc0: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
dfd0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
dfe0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
dff0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
e000: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
e010: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
e020: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
e030: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
e040: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
e050: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c  e(&data[iPtr]))<
e060: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
e070: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
e080: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69  r+4 ){.        i
e090: 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  f( iFreeBlk==0 )
e0a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e0b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e0c0: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
e0d0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
e0e0: 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46  .      iPtr = iF
e0f0: 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20  reeBlk;.    }.  
e100: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69    if( iFreeBlk>i
e110: 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  Last ) return SQ
e120: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e130: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
e140: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
e150: 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72  eBlk>iPtr || iFr
e160: 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20  eeBlk==0 );.  . 
e170: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
e180: 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69  int:.    **    i
e190: 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74  FreeBlk:   First
e1a0: 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72   freeblock after
e1b0: 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f   iStart, or zero
e1c0: 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20   if none.    ** 
e1d0: 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54     iPtr:       T
e1e0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20  he address of a 
e1f0: 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65  pointer to iFree
e200: 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  Blk.    **.    *
e210: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
e220: 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c  f iFreeBlk shoul
e230: 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f  d be coalesced o
e240: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
e250: 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  Start..    */.  
e260: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26    if( iFreeBlk &
e270: 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42  & iEnd+3>=iFreeB
e280: 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61  lk ){.      nFra
e290: 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69  g = iFreeBlk - i
e2a0: 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69  End;.      if( i
e2b0: 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72  End>iFreeBlk ) r
e2c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e2d0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
e2e0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 45  >pgno);.      iE
e2f0: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
e300: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e310: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
e320: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
e330: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e340: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
e350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e360: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
e370: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
e380: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
e390: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
e3a0: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
e3b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
e3c0: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
e3d0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
e3e0: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
e3f0: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
e400: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
e410: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
e420: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
e430: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
e440: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
e450: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
e460: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
e470: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
e480: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
e490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
e4a0: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
e4b0: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
e4c0: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
e4d0: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
e4e0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
e4f0: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
e500: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
e510: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
e520: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e530: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
e540: 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  );.        nFrag
e550: 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
e560: 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
e570: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
e580: 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
e590: 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
e5a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e5b0: 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
e5c0: 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
e5d0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
e5e0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
e5f0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
e600: 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28  nFrag;.  }.  if(
e610: 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74   iStart==get2byt
e620: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
e630: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
e640: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
e650: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
e660: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
e670: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
e680: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
e690: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
e6a0: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
e6b0: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
e6c0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
e6d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
e6e0: 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  ( iPtr!=hdr+1 ) 
e6f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e700: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
e710: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74  ->pgno);.    put
e720: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e730: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
e740: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e750: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
e760: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e770: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
e780: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
e790: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
e7a0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e7b0: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
e7c0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
e7d0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
e7e0: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
e7f0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
e800: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
e810: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
e820: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
e830: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e840: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
e850: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
e860: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
e870: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
e880: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
e890: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
e8a0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
e8b0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
e8c0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
e8d0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
e8e0: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
e8f0: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
e900: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
e910: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
e920: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
e930: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
e940: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
e950: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
e960: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
e970: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
e980: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e990: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
e9a0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
e9b0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e9c0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
e9d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
e9e0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
e9f0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
ea00: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
ea10: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
ea20: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
ea30: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
ea40: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
ea50: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
ea60: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
ea70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ea80: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ea90: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
eaa0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
eab0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
eac0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
ead0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
eae0: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
eaf0: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
eb00: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
eb10: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
eb20: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
eb30: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
eb40: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
eb50: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
eb60: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
eb70: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
eb80: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
eb90: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
eba0: 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
ebb0: 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
ebc0: 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
ebd0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
ebe0: 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
ebf0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
ec00: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
ec10: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
ec20: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
ec30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec40: 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
ec50: 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
ec60: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
ec70: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
ec80: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
ec90: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
eca0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
ecb0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
ecc0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
ecd0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
ece0: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
ecf0: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
ed00: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
ed10: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
ed20: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
ed30: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
ed40: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
ed50: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
ed60: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
ed70: 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
ed80: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
ed90: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
eda0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
edb0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
edc0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
edd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
ede0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
edf0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
ee00: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ee10: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
ee20: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
ee30: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
ee40: 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
ee50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
ee60: 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
ee70: 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
ee80: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
ee90: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
eea0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
eeb0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
eec0: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
eed0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
eee0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
eef0: 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
ef00: 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
ef10: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
ef20: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
ef30: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
ef40: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ef50: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
ef60: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
ef70: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
ef80: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
ef90: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
efa0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
efb0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
efc0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
efd0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
efe0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
eff0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
f000: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f010: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
f020: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
f030: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
f040: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
f050: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
f060: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
f070: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
f080: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
f090: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f0a0: 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
f0b0: 6f 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  o);.  }.  pPage-
f0c0: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
f0d0: 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
f0e0: 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
f0f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f100: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
f110: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
f120: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
f130: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
f140: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
f150: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
f160: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
f170: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
f180: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
f190: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
f1a0: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
f1b0: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
f1c0: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
f1d0: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
f1e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
f1f0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
f200: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
f210: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
f220: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
f230: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
f240: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
f250: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
f260: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
f270: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
f280: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b  Page){.  int pc;
f290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f2a0: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
f2b0: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
f2c0: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
f2d0: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
f2e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
f2f0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
f300: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ge header */.  u
f310: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
f320: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
f330: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
f340: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
f350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
f360: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
f370: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
f380: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
f390: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
f3a0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
f3b0: 20 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66   */.  u16 cellOf
f3c0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
f3d0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
f3e0: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
f3f0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
f400: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
f410: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f420: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
f430: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
f440: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
f450: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
f460: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
f470: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
f480: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
f490: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
f4a0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
f4b0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
f4c0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
f4d0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
f4e0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
f4f0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
f500: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
f510: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
f520: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
f530: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
f540: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f550: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
f560: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
f570: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f580: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
f590: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
f5a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
f5b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f5c0: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
f5d0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
f5e0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
f5f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
f600: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
f610: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
f620: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
f630: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
f640: 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42  Init==0 );..  pB
f650: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
f660: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
f670: 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  drOffset;.  data
f680: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
f690: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
f6a0: 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30  F: R-28594-02890
f6b0: 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c   The one-byte fl
f6c0: 61 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69  ag at offset 0 i
f6d0: 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74  ndicating.  ** t
f6e0: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
f6f0: 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65  ype. */.  if( de
f700: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
f710: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20   data[hdr]) ){. 
f720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f730: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
f740: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
f750: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
f760: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
f770: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
f780: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
f790: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
f7a0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
f7b0: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
f7c0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
f7d0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
f7e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
f7f0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
f800: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
f810: 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65   hdr + 8 + pPage
f820: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
f830: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
f840: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
f850: 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
f860: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
f870: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
f880: 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
f890: 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
f8a0: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
f8b0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f8c0: 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
f8d0: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f8e0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
f8f0: 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20  designates.  ** 
f900: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f910: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f920: 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
f930: 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
f940: 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70  r is.  ** interp
f950: 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20  reted as 65536. 
f960: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
f970: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
f980: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45  [hdr+5]);.  /* E
f990: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
f9a0: 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
f9b0: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
f9c0: 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
f9d0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
f9e0: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
f9f0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67   page. */.  pPag
fa00: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
fa10: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
fa20: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
fa30: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
fa40: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20  t) ){.    /* To 
fa50: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
fa60: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
fa70: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
fa80: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72  corrupt */.    r
fa90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
faa0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
fab0: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 74 65  >pgno);.  }.  te
fac0: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
fad0: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
fae0: 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  t) );.  /* EVIDE
faf0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d  NCE-OF: R-24089-
fb00: 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20  57979 If a page 
fb10: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
fb20: 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  s (which is only
fb30: 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66  .  ** possible f
fb40: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
fb50: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
fb60: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
fb70: 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   then the.  ** o
fb80: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
fb90: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77  l content area w
fba0: 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61  ill equal the pa
fbb0: 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68  ge size minus th
fbc0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20  e.  ** bytes of 
fbd0: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20  reserved space. 
fbe0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
fbf0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74  ge->nCell>0 || t
fc00: 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  op==usableSize |
fc10: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
fc20: 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65  .  /* A malforme
fc30: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
fc40: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
fc50: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
fc60: 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65  end.  ** of page
fc70: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
fc80: 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  cell.  .  **.  *
fc90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
fca0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
fcb0: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
fcc0: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
fcd0: 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68  nds.  ** past th
fce0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
fcf0: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
fd00: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
fd10: 50 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72  PT to be .  ** r
fd20: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
fd30: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c  es..  */.  iCell
fd40: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
fd50: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
fd60: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
fd70: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
fd80: 34 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62  4;.  if( pBt->db
fd90: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
fda0: 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20  _CellSizeCk ){. 
fdb0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
fdc0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
fdd0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
fde0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
fdf0: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
fe00: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
fe10: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28  cell */..    if(
fe20: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
fe30: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
fe40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
fe50: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
fe60: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
fe70: 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61  yteAligned(&data
fe80: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
fe90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
fea0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
feb0: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
fec0: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
fed0: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
fee0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
fef0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
ff00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ff10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
ff20: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
ff30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ff40: 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
ff50: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
ff60: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 74  ta[pc]);.      t
ff70: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
ff80: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
ff90: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
ffa0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
ffb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ffc0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
ffd0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
ffe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fff0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
10000 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
10010 20 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75   }  ..  /* Compu
10020 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
10030 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
10040 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43  age.  ** EVIDENC
10050 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
10060 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
10070 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
10080 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
10090 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65   ** start of the
100a0 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
100b0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72   on the page, or
100c0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72   is zero if ther
100d0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72  e are no.  ** fr
100e0 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70  eeblocks. */.  p
100f0 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
10100 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46  ta[hdr+1]);.  nF
10110 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
10120 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
10130 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
10140 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
10150 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e  ace */.  if( pc>
10160 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78  0 ){.    u32 nex
10170 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28  t, size;.    if(
10180 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29   pc<iCellFirst )
10190 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
101a0 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
101b0 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
101c0 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
101d0 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
101e0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
101f0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
10200 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
10210 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
10220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10240 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
10250 3e 70 67 6e 6f 29 3b 20 0a 20 20 20 20 7d 0a 20  >pgno); .    }. 
10260 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
10270 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c       if( pc>iCel
10280 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
10290 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66   /* Freeblock of
102a0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
102b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
102c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
102d0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
102e0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
102f0 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
10300 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10310 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
10320 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10330 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46  pc+2]);.      nF
10340 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
10350 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ze;.      if( ne
10360 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20  xt<=pc+size+3 ) 
10370 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20  break;.      pc 
10380 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  = next;.    }.  
10390 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a    if( next>0 ){.
103a0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f        /* Freeblo
103b0 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64  ck not in ascend
103c0 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
103d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
103e0 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
103f0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
10400 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a  }.    if( pc+siz
10410 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10420 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10430 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65      /* Last free
10440 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61  block extends pa
10450 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20  st page end */. 
10460 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10470 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
10480 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
10490 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74    }.  }..  /* At
104a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72   this point, nFr
104b0 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ee contains the 
104c0 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65  sum of the offse
104d0 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
104e0 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d   ** of the cell-
104f0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75  content area plu
10500 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
10510 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69  free bytes withi
10520 6e 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d  n.  ** the cell-
10530 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
10540 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
10550 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
10560 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68  -size.  ** of th
10570 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
10580 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
10590 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68  rrupted. This ch
105a0 65 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65  eck also.  ** se
105b0 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
105c0 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
105d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
105e0 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
105f0 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
10600 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
10610 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
10620 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
10630 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e   */.  if( nFree>
10640 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10660 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
10670 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
10680 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
10690 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
106a0 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61  ellFirst);.  pPa
106b0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
106c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
106e0 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
106f0 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
10700 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
10710 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
10720 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
10730 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
10740 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
10750 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
10760 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10770 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
10780 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
10790 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
107a0 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
107b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
107c0 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
107d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
107e0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
107f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
10800 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
10810 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10820 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
10830 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10840 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
10850 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10860 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
10870 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10880 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
10890 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
108a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
108b0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
108c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
108d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
108e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
108f0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
10900 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52  & BTS_FAST_SECUR
10910 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
10920 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
10930 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
10940 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74   hdr);.  }.  dat
10950 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
10960 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
10970 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54  hdr + ((flags&PT
10980 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20  F_LEAF)==0 ? 12 
10990 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  : 8);.  memset(&
109a0 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
109b0 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
109c0 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
109d0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
109e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
109f0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
10a00 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
10a10 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
10a20 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  );.  decodeFlags
10a30 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
10a40 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
10a50 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
10a60 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
10a70 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62   &data[pBt->usab
10a80 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
10a90 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
10aa0 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61  ta[first];.  pPa
10ab0 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
10ac0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
10ad0 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50  ldPtrSize];.  pP
10ae0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
10af0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
10b00 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
10b10 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
10b20 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
10b30 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
10b40 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
10b50 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
10b60 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
10b70 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
10b80 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
10b90 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
10ba0 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
10bb0 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
10bc0 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
10bd0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
10be0 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
10bf0 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
10c00 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
10c10 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
10c20 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
10c30 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
10c40 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
10c50 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
10c60 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
10c70 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67    if( pgno!=pPag
10c80 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  e->pgno ){.    p
10c90 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
10ca0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10cb0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
10cc0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
10cd0 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50   pDbPage;.    pP
10ce0 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
10cf0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20      pPage->pgno 
10d00 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67  = pgno;.    pPag
10d10 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
10d20 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
10d30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10d40 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71  pPage->aData==sq
10d50 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10d60 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  a(pDbPage) );.  
10d70 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
10d80 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
10d90 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
10da0 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
10db0 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
10dc0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
10dd0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
10de0 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
10df0 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
10e00 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
10e10 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
10e20 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
10e30 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
10e40 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
10e50 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
10e60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
10e70 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
10e80 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
10e90 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
10ea0 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
10eb0 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
10ec0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
10ed0 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
10ee0 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
10ef0 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
10f00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
10f10 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
10f20 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
10f30 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
10f40 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
10f50 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
10f60 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
10f70 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
10f80 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
10f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10fa0 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
10fb0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10fc0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
10fd0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10ff0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
11000 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
11010 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
11020 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
11030 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
11040 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
11050 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
11060 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
11070 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
11080 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
11090 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
110a0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
110b0 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
110c0 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
110d0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
110e0 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
110f0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
11100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11110 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11120 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11140 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
11150 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
11160 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61  **)&pDbPage, fla
11170 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  gs);.  if( rc ) 
11180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
11190 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
111a0 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
111b0 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
111c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
111d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
111e0 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
111f0 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
11200 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
11210 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
11220 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
11230 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
11240 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
11250 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
11260 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
11270 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
11280 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
11290 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
112a0 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
112b0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
112c0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
112d0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
112e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
112f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11300 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
11310 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
11320 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
11330 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
11340 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
11350 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
11360 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
11370 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
11380 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
11390 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
113a0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
113b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
113c0 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
113d0 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
113e0 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
113f0 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
11400 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
11410 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67  ic Pgno btreePag
11420 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
11430 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pBt){.  return 
11440 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33  pBt->nPage;.}.u3
11450 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  2 sqlite3BtreeLa
11460 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29  stPage(Btree *p)
11470 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
11480 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
11490 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
114a0 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61  t( ((p->pBt->nPa
114b0 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d  ge)&0x8000000)==
114c0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
114d0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
114e0 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
114f0 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
11500 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
11510 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a  tialize it..**.*
11520 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65  * If pCur!=0 the
11530 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
11540 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70  ing fetched as p
11550 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43  art of a moveToC
11560 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20  hild().** call. 
11570 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73   Do additional s
11580 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
11590 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
115a0 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20  is case..** And 
115b0 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69  if the fetch fai
115c0 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ls, this routine
115d0 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20   must decrement 
115e0 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a  pCur->iPage..**.
115f0 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66  ** The page is f
11600 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77  etched as read-w
11610 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72  rite unless pCur
11620 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
11630 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e   is.** a read-on
11640 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ly cursor..**.**
11650 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11660 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  urs, then *ppPag
11670 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
11680 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
11690 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
116a0 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
116b0 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
116c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
116d0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
116e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
11710 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
11720 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
11730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11740 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
11750 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
11760 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11780 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
11790 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
117a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
117b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
117c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
117d0 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c  eceive the page,
117e0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
117f0 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20  t bReadOnly     
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11810 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
11820 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b  -only page */.){
11830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
11840 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11850 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11860 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11870 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11880 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11890 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70  pPage==&pCur->ap
118a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
118b0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
118c0 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f  Cur==0 || bReadO
118d0 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61  nly==pCur->curPa
118e0 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73  gerFlags );.  as
118f0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
11900 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
11910 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
11920 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
11930 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
11940 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
11950 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  T;.    goto getA
11960 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11970 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
11980 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
11990 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
119a0 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
119b0 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a  ge, bReadOnly);.
119c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
119d0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
119e0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
119f0 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50   *ppPage = (MemP
11a00 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
11a10 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
11a20 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61  e);.  if( (*ppPa
11a30 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
11a40 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46  {.    btreePageF
11a50 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
11a60 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
11a70 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
11a80 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
11a90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11ab0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
11ac0 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ge);.      goto 
11ad0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11ae0 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
11af0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
11b00 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
11b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
11b20 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73  pPage)->aData==s
11b30 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
11b40 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  ta(pDbPage) );..
11b50 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e    /* If obtainin
11b60 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66  g a child page f
11b70 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20  or a cursor, we 
11b80 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74  must verify that
11b90 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a   the page is.  *
11ba0 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  * compatible wit
11bb0 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e  h the root page.
11bc0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26   */.  if( pCur &
11bd0 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43  & ((*ppPage)->nC
11be0 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67  ell<1 || (*ppPag
11bf0 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  e)->intKey!=pCur
11c00 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a  ->curIntKey) ){.
11c10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11c20 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e  CORRUPT_PGNO(pgn
11c30 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  o);.    releaseP
11c40 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11c50 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11c60 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11c70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11c80 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74  _OK;..getAndInit
11c90 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66  Page_error:.  if
11ca0 28 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69  ( pCur ) pCur->i
11cb0 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61  Page--;.  testca
11cc0 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
11cd0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
11ce0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
11cf0 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
11d00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11d10 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
11d20 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
11d30 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
11d40 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
11d50 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
11d60 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
11d70 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
11d80 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
11d90 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
11da0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11dc0 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
11dd0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
11de0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
11df0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11e00 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
11e10 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
11e20 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
11e30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11e40 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
11e50 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
11e60 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
11e70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11e80 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11e90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11ea0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
11eb0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
11ec0 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
11ed0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
11ee0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
11ef0 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
11f00 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
11f10 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
11f20 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75  ../*.** Get an u
11f30 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nused page..**.*
11f40 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
11f50 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50  t like btreeGetP
11f60 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61  age() with the a
11f70 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ddition:.**.**  
11f80 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20   *  If the page 
11f90 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
11fa0 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
11fb0 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69   purpose, immedi
11fc0 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65  ately.**      re
11fd0 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74  lease it and ret
11fe0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55  urn an SQLITE_CU
11ff0 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20  RRUPT error..** 
12000 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74    *  Make sure t
12010 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69  he isInit flag i
12020 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69  s clear.*/.stati
12030 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e  c int btreeGetUn
12040 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68  usedPage(.  BtSh
12050 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
12060 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
12070 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
12080 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12090 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
120a0 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
120b0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
120c0 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
120d0 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
120e0 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
120f0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
12100 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
12110 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
12120 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
12130 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74  ){.  int rc = bt
12140 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
12150 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
12160 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
12170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12180 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12190 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
121a0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
121b0 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
121c0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
121d0 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
121e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
121f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12200 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
12210 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
12220 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
12230 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
12240 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
12250 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75  rc;.}.../*.** Du
12260 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
12270 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
12280 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
12290 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
122a0 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
122b0 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
122c0 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
122d0 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
122e0 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
122f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
12300 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
12310 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
12320 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
12330 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12340 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
12350 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
12360 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
12370 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
12380 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
12390 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
123a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
123b0 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
123c0 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
123d0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
123e0 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
123f0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
12400 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
12410 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12420 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12430 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
12440 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
12450 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
12460 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12470 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12480 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
12490 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
124a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
124b0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
124c0 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
124d0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
124e0 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
124f0 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
12500 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
12510 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
12520 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
12530 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
12540 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
12550 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
12560 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
12570 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
12580 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
12590 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
125a0 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
125b0 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
125c0 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
125d0 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
125e0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
125f0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
12600 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
12610 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
12620 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
12630 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
12640 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
12650 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
12660 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
12670 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
12680 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
12690 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
126a0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
126b0 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
126c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
126d0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
126e0 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
126f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12700 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
12710 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
12720 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
12730 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12740 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
12750 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
12760 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
12770 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
12780 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
12790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
127a0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
127b0 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
127c0 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
127d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
127e0 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
127f0 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
12800 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
12810 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
12820 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
12830 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
12840 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
12850 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
12860 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
12870 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
12880 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
12890 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
128a0 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
128b0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
128c0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
128d0 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
128e0 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
128f0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
12900 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
12910 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
12920 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12930 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
12940 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
12950 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
12960 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
12970 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
12980 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
12990 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
129a0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
129b0 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45  its like.** BTRE
129c0 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  E_OMIT_JOURNAL a
129d0 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f  nd/or BTREE_MEMO
129e0 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  RY..**.** If the
129f0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
12a00 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
12a10 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
12a20 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
12a30 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
12a40 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
12a50 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
12a60 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
12a70 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
12a80 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
12a90 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
12aa0 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
12ab0 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
12ac0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12ad0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
12ae0 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
12af0 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
12b00 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
12b10 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12b20 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71  3BtreeOpen(.  sq
12b30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12b40 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
12b50 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74  use for this b-t
12b60 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ree */.  const c
12b70 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
12b80 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12b90 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
12ba0 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
12bb0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
12bc0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12bd0 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
12be0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
12bf0 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
12c00 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
12c10 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
12c20 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
12c30 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
12c40 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12c50 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
12c60 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
12c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12c80 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
12c90 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
12ca0 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
12cb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12cc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12cd0 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
12ce0 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
12cf0 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
12d00 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12d10 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
12d20 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
12d30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
12d40 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
12d50 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
12d60 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
12d70 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
12d80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12d90 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
12da0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
12db0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
12dc0 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
12dd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12de0 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
12df0 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
12e00 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
12e10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
12e20 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
12e30 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
12e40 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
12e50 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e  * True if openin
12e60 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20  g an ephemeral, 
12e70 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12e80 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  se */.  const in
12e90 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69  t isTempDb = zFi
12ea0 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
12eb0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20  lename[0]==0;.. 
12ec0 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
12ed0 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
12ee0 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
12ef0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
12f00 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
12f10 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
12f20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
12f30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12f40 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e  T_MEMORYDB.  con
12f50 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
12f60 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73   0;.#else.  cons
12f70 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
12f80 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74  (zFilename && st
12f90 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
12fa0 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a  ":memory:")==0).
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d         || (isTem
12fd0 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65  pDb && sqlite3Te
12fe0 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a  mpInMemory(db)).
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c         || (vfsFl
13010 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13020 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65  N_MEMORY)!=0;.#e
13030 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
13040 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
13050 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20  t( pVfs!=0 );.  
13060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13070 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
13080 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
13090 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d  t( (flags&0xff)=
130a0 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66  =flags );   /* f
130b0 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69  lags fit in 8 bi
130c0 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  ts */..  /* Only
130d0 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   a BTREE_SINGLE 
130e0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
130f0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20  BTREE_UNORDERED 
13100 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
13110 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52  ags & BTREE_UNOR
13120 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c  DERED)==0 || (fl
13130 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
13140 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  LE)!=0 );..  /* 
13150 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  A BTREE_SINGLE d
13160 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79  atabase is alway
13170 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  s a temporary an
13180 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a  d/or ephemeral *
13190 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
131a0 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
131b0 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44  E)==0 || isTempD
131c0 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65  b );..  if( isMe
131d0 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  mdb ){.    flags
131e0 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59   |= BTREE_MEMORY
131f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73  ;.  }.  if( (vfs
13200 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13210 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20  PEN_MAIN_DB)!=0 
13220 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69  && (isMemdb || i
13230 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20  sTempDb) ){.    
13240 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
13250 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
13260 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
13270 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
13280 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  DB;.  }.  p = sq
13290 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
132a0 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
132b0 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
132c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
132d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
132e0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
132f0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
13300 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
13310 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13320 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
13330 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
13340 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
13350 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
13360 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13370 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13380 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13390 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
133a0 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
133b0 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
133c0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
133d0 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
133e0 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
133f0 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
13400 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
13410 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
13420 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
13430 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
13440 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
13450 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
13460 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
13470 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
13480 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
13490 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
134a0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
134b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
134c0 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
134d0 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
134e0 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
134f0 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
13500 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
13510 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
13520 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
13530 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
13540 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
13550 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
13560 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
13570 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
13580 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
13590 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
135a0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
135b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
135c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
135d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
135e0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
135f0 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
13600 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
13610 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
13620 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e  Filename, nFilen
13630 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
13640 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13650 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
13660 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
13670 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
136a0 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
136b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
136c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
136d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
136e0 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
136f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13700 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13710 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13730 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
13740 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
13750 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
13760 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
13770 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
13780 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
13790 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
137a0 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
137b0 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
137c0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
137d0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
137e0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
137f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13800 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13810 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
13820 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
13830 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
13840 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
13850 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
13860 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
13870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13880 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
13890 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
138a0 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
138b0 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
138c0 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
138d0 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
138e0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
138f0 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
13900 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
13910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
13920 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
13930 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
13940 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
13950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
13960 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
13970 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
13980 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
13990 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
139a0 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
139b0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
139c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
139d0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
139e0 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
139f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13a00 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
13a10 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
13a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13a30 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
13a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
13a50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
13a80 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
13a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13aa0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
13ab0 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
13ac0 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
13ad0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
13ae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13af0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13b00 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
13b10 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
13b20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13b30 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
13b40 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
13b50 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
13b60 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
13b70 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
13b80 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
13b90 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
13ba0 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
13bb0 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
13bc0 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
13bd0 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
13be0 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
13bf0 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
13c00 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
13c10 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
13c20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
13c30 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
13c40 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
13c50 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
13c60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
13c70 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
13c80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
13c90 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
13ca0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
13cb0 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
13cc0 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
13cd0 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
13ce0 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
13cf0 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
13d00 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
13d10 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
13d20 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
13d30 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
13d40 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
13d50 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
13d60 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
13d70 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
13d80 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13d90 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (i64)==8 );.    
13da0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13db0 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13dc0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
13dd0 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
13de0 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
13df0 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
13e00 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
13e10 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
13e20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13e30 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
13e40 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
13e50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
13e60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
13e70 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
13e80 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13e90 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13ea0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
13eb0 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
13ec0 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
13ef0 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c  MemPage), flags,
13f00 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
13f10 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
13f20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13f40 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
13f50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
13f60 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
13f70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13f80 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
13f90 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
13fa0 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
13fb0 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
13fc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
13fe0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13ff0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
14000 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
14010 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
14020 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
14030 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
14040 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
14050 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
14060 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
14070 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
14080 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
14090 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
140a0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
140b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
140c0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
140d0 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
140e0 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
140f0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
14100 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  LY;.#if defined(
14110 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
14120 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62  LETE).    pBt->b
14130 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
14140 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65  ECURE_DELETE;.#e
14150 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
14160 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44  TE_FAST_SECURE_D
14170 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e  ELETE).    pBt->
14180 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14190 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69  OVERWRITE;.#endi
141a0 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  f.    /* EVIDENC
141b0 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
141c0 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
141d0 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
141e0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
141f0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
14200 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
14210 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
14220 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
14230 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
14240 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
14250 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14260 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61  . */.    pBt->pa
14270 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61  geSize = (zDbHea
14280 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a  der[16]<<8) | (z
14290 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36  DbHeader[17]<<16
142a0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
142b0 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
142c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
142d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
142e0 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
142f0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
14300 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
14310 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
14320 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
14330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14340 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14350 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
14360 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
14370 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
14380 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
14390 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
143a0 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
143b0 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
143c0 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
143d0 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
143e0 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
143f0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
14400 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
14410 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
14420 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
14430 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
14440 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
14450 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
14460 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
14470 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
14480 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
14490 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
144a0 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
144b0 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
144c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
144d0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
144e0 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
144f0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
14500 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
14510 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
14520 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
14530 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
14540 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
14550 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
14560 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
14570 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
14580 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
14590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
145a0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
145b0 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
145c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
145d0 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
145e0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  .      ** determ
145f0 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
14600 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
14610 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
14620 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
14630 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
14640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
14650 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eader. */.      
14660 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
14670 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
14680 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14690 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
146a0 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
146b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
146c0 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
146d0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
146e0 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
146f0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
14700 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
14710 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
14720 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
14730 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
14740 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
14750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14760 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
14770 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
14780 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
14790 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
147a0 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
147b0 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
147c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
147d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
147e0 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
147f0 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
14800 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
14810 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
14820 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
14830 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
14840 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14850 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
14860 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14870 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
14880 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
14890 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
148a0 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
148b0 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
148c0 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
148d0 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
148e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
148f0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
14900 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
14910 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
14920 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d  hared; ).      M
14930 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
14940 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
14950 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14960 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14970 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
14980 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14990 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
149a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
149b0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
149c0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
149d0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
149e0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
149f0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
14a00 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
14a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14a20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14a30 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
14a40 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
14a50 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
14a60 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14a70 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14a80 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14a90 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
14aa0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14ab0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14ac0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
14ad0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14ae0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14af0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
14b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14b10 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14b20 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
14b30 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
14b40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14b50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14b60 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14b70 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14b80 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
14b90 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
14ba0 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
14bb0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
14bc0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
14bd0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
14be0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
14bf0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
14c00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
14c10 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
14c20 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
14c30 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
14c40 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
14c50 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14c60 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14c70 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14c90 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14ca0 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
14cb0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
14cc0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
14cd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
14ce0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
14cf0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
14d00 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
14d10 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42   if( (uptr)p->pB
14d20 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42  t<(uptr)pSib->pB
14d30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
14d40 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
14d50 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
14d60 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
14d70 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
14d80 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14d90 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
14da0 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
14db0 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e  & (uptr)pSib->pN
14dc0 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  ext->pBt<(uptr)p
14dd0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
14de0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
14df0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14e10 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
14e20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14e30 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14e40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14e50 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14e60 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14e70 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14e90 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
14ea0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
14eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14ec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
14ed0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
14ee0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
14ef0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
14f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14f10 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
14f20 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14f30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14f40 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
14f50 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
14f60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
14f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14f80 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
14f90 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
14fa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
14fb0 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20  le *pFile;..    
14fc0 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
14fd0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
14fe0 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
14ff0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
15000 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
15010 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
15020 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
15030 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
15040 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
15050 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
15060 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
15070 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
15080 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
15090 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
150a0 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
150b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
150c0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
150d0 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
150e0 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
150f0 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
15100 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20     }..    pFile 
15110 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
15120 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  le(pBt->pPager);
15130 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
15140 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
15150 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
15160 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65  ontrolHint(pFile
15170 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
15180 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d  DB, (void*)&pBt-
15190 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >db);.    }.  }.
151a0 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
151b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
151c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
151d0 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
151e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
151f0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
15200 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  n);.  }.  assert
15210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15220 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  || sqlite3BtreeC
15230 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a  onnectionCount(*
15240 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20  ppBtree)>0 );.  
15250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15260 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
15270 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
15280 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
15290 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
152a0 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
152b0 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
152c0 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
152d0 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
152e0 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
152f0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
15300 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
15310 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
15320 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
15330 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
15340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
15350 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
15360 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
15370 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
15380 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15390 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  CHE.  MUTEX_LOGI
153a0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
153b0 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42   *pMaster; ).  B
153c0 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
153d0 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
153e0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
153f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
15400 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
15410 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  );.  MUTEX_LOGIC
15420 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
15430 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
15440 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
15450 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
15460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15470 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
15480 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
15490 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
154a0 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
154b0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
154c0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
154d0 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
154e0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
154f0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15500 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
15510 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
15520 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
15530 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
15540 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15550 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
15560 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
15570 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
15580 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
15590 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
155a0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
155b0 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
155c0 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
155d0 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
155e0 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
155f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15600 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
15610 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
15620 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
15630 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
15640 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
15650 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
15660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15670 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
15680 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
15690 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
156a0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
156b0 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
156c0 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
156d0 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
156e0 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
156f0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20  SIZE(pBt) bytes 
15700 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72  with a 4-byte pr
15710 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d  efix for a left-
15720 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72  child.** pointer
15730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15740 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
15750 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
15760 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
15770 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
15780 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
15790 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
157a0 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
157b0 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
157c0 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
157d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
157e0 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
157f0 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
15800 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
15810 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
15820 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
15830 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
15840 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
15850 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
15860 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
15870 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
15880 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
15890 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
158a0 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
158b0 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
158c0 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
158d0 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
158e0 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
158f0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
15900 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
15910 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
15920 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
15930 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
15940 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
15950 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
15960 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
15970 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
15980 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
15990 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
159a0 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
159b0 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
159c0 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
159d0 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
159e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
159f0 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
15a00 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
15a10 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
15a20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
15a30 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
15a40 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
15a50 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a  ce here..    **.
15a60 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72      ** Also:  Pr
15a70 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73  ovide four bytes
15a80 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
15a90 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65  space before the
15aa0 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e  .    ** beginnin
15ab0 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61  g of pTmpSpace a
15ac0 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61  s an area availa
15ad0 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74  ble to prepend t
15ae0 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63  he.    ** left-c
15af0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  hild pointer to 
15b00 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15b10 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a   a cell..    */.
15b20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
15b30 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
15b40 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
15b50 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20  Space, 0, 8);.  
15b60 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15b70 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ce += 4;.    }. 
15b80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
15b90 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
15ba0 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
15bb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
15bc0 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
15bd0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15be0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
15bf0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
15c00 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20  pSpace -= 4;.   
15c10 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
15c20 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29  (pBt->pTmpSpace)
15c30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  ;.    pBt->pTmpS
15c40 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pace = 0;.  }.}.
15c50 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
15c60 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
15c70 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
15c80 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
15c90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15ca0 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
15cb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15cc0 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
15cd0 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
15ce0 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
15cf0 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
15d00 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
15d10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15d20 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15d30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15d40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15d50 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
15d60 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
15d70 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
15d80 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
15d90 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
15da0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
15db0 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
15dc0 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
15dd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
15de0 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
15df0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
15e00 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
15e10 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
15e20 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
15e30 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
15e40 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
15e50 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
15e60 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
15e70 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
15e80 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
15e90 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
15ea0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15eb0 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  k(p, SQLITE_OK, 
15ec0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  0);.  sqlite3Btr
15ed0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
15ee0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
15ef0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
15f00 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
15f10 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
15f20 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
15f30 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
15f40 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
15f50 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
15f60 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
15f70 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
15f80 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
15f90 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15fa0 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
15fb0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
15fc0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
15fd0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
15fe0 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
15ff0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
16000 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
16010 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
16020 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
16030 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
16040 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
16050 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
16060 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
16070 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
16080 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
16090 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
160a0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
160b0 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
160c0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
160d0 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a  pPager, p->db);.
160e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
160f0 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
16100 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
16110 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
16120 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
16130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16140 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
16150 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
16160 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
16170 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
16180 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
16190 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
161a0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
161b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
161c0 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
161d0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
161e0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
161f0 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
16200 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16210 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
16220 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
16230 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
16240 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
16250 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
16260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
16280 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d  e the "soft" lim
16290 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
162a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
162b0 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65   cache..** Unuse
162c0 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64  d and unmodified
162d0 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72   pages will be r
162e0 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65  ecycled when the
162f0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
16300 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
16310 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f   exceeds this so
16320 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74  ft limit.  But t
16330 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
16340 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77  * cache is allow
16350 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65  ed to grow large
16360 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69  r than this limi
16370 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  t if it contains
16380 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20  .** dirty pages 
16390 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69  or pages still i
163a0 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f  n active use..*/
163b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
163c0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
163d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
163e0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
163f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16400 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16410 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16420 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16430 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16440 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16450 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16460 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
16470 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
16480 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
164a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
164b0 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69  e the "spill" li
164c0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
164d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
164e0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74  e cache..** If t
164f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
16500 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20  es exceeds this 
16510 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77  limit during a w
16520 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
16530 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d  ,.** the pager m
16540 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20  ight attempt to 
16550 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f  "spill" pages to
16560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72   the journal ear
16570 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74  ly in.** order t
16580 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79  o free up memory
16590 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
165a0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
165b0 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
165c0 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69  size.  If zero i
165d0 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61  s passed.** as a
165e0 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63  n argument, no c
165f0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
16600 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a  to the spill siz
16610 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a  e setting, so.**
16620 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66   using mxPage of
16630 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71   0 is a way to q
16640 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74  uery the current
16650 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a   spill size..*/.
16660 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16670 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72  SetSpillSize(Btr
16680 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16690 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
166a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
166b0 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
166c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
166d0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
166e0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
166f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16700 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61   res = sqlite3Pa
16710 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  gerSetSpillsize(
16720 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
16730 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
16740 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16750 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23  return res;.}..#
16760 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
16770 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
16780 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
16790 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
167a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
167b0 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ile that may be.
167c0 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ** memory mapped
167d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
167e0 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
167f0 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69  t(Btree *p, sqli
16800 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
16810 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16820 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16830 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16840 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16850 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16860 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16870 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16880 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
16890 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61  t->pPager, szMma
168a0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
168b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
168c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
168d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
168e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
168f0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  >0 */../*.** Cha
16900 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
16910 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
16920 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
16930 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
16940 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
16950 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
16960 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
16970 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
16980 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
16990 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
169a0 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
169b0 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
169c0 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
169d0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
169e0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
169f0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
16a00 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
16a10 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
16a20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
16a30 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
16a40 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
16a50 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
16a60 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
16a70 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
16a80 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
16a90 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
16aa0 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
16ab0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16ac0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
16ad0 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
16ae0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
16af0 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70  lags(.  Btree *p
16b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16b10 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73  * The btree to s
16b20 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65  et the safety le
16b30 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  vel on */.  unsi
16b40 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
16b50 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41     /* Various PA
16b60 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  GER_* flags */.)
16b70 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16b80 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16b90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16ba0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16bb0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16bc0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16bd0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16be0 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
16bf0 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a  ager, pgFlags);.
16c00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16c10 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
16c30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
16c40 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
16c50 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
16c60 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16c70 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
16c80 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
16c90 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
16ca0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
16cb0 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
16cc0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
16cd0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
16ce0 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
16cf0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
16d00 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
16d10 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
16d20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
16d30 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
16d40 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
16d50 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
16d60 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
16d70 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
16d80 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
16d90 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
16da0 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
16db0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
16dc0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
16dd0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
16de0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
16df0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
16e00 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
16e10 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
16e20 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
16e30 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
16e40 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
16e50 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
16e60 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
16e70 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
16e80 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
16e90 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
16ea0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
16eb0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16ec0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
16ed0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
16ee0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
16ef0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
16f00 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
16f10 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
16f20 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
16f30 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
16f40 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
16f50 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
16f60 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
16f70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16f80 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
16f90 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
16fa0 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
16fb0 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
16fc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16fd0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
16fe0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
17000 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
17010 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
17020 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17030 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
17040 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
17050 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
17060 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
17070 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17080 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
17090 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
170a0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
170b0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
170c0 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
170d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
170e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
170f0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
17100 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
17110 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
17120 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
17130 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
17140 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
17150 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
17160 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
17170 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
17180 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
17190 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
171a0 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
171b0 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
171c0 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
171d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
171e0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
171f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
17200 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
17210 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
17220 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
17230 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
17240 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
17250 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17260 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
17270 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
17280 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
17290 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
172a0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
172b0 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
172c0 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
172d0 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
172e0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
172f0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
17300 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17320 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17330 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
17340 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
17350 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17360 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
17370 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
17380 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
17390 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
173a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
173b0 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
173c0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
173d0 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
173e0 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
173f0 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
17400 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
17410 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
17420 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
17430 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
17440 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
17450 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
17460 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
17470 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
17480 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
17490 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
174a0 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
174b0 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
174c0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
174d0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
174e0 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
174f0 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
17500 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17510 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
17520 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
17530 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
17540 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
17550 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
17560 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
17570 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
17580 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
17590 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
175a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
175b0 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
175c0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
175d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
175e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
175f0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
17600 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
17610 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
17620 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
17630 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
17640 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
17650 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17660 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17670 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
17680 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
17690 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
176a0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
176b0 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
176c0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
176d0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
176e0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
176f0 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
17700 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
17710 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
17720 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
17730 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
17740 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
17750 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
17760 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
17770 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
17780 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
17790 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
177a0 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
177b0 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
177c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
177d0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
177e0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
177f0 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
17800 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17810 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
17820 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17830 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
17840 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17850 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
17860 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17870 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
17880 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17890 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
178a0 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
178b0 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
178c0 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
178d0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
178e0 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
178f0 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
17900 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
17910 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
17920 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
17930 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
17940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17950 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
17960 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17970 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
17980 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17990 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
179a0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
179b0 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
179c0 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
179d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
179e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
179f0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n n;.}../*.** Ch
17a00 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 73 20  ange the values 
17a10 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45 43 55  for the BTS_SECU
17a20 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54  RE_DELETE and BT
17a30 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67  S_OVERWRITE flag
17a40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46  s:.**.**    newF
17a50 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74  lag==0       Bot
17a60 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  h BTS_SECURE_DEL
17a70 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  ETE and BTS_OVER
17a80 57 52 49 54 45 20 61 72 65 20 63 6c 65 61 72 65  WRITE are cleare
17a90 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  d.**    newFlag=
17aa0 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53 45 43  =1       BTS_SEC
17ab0 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61  URE_DELETE set a
17ac0 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
17ad0 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20   is cleared.**  
17ae0 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20    newFlag==2    
17af0 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45     BTS_SECURE_DE
17b00 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64  LETE cleared and
17b10 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69   BTS_OVERWRITE i
17b20 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46  s set.**    newF
17b30 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20  lag==(-1)    No 
17b40 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68  changes.**.** Th
17b50 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
17b60 61 73 20 61 20 71 75 65 72 79 20 69 66 20 6e 65  as a query if ne
17b70 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68  wFlag is less th
17b80 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69  an zero.**.** Wi
17b90 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  th BTS_OVERWRITE
17ba0 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f   set, deleted co
17bb0 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69  ntent is overwri
17bc0 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62  tten by zeros, b
17bd0 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  ut.** freelist l
17be0 65 61 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f  eaf pages are no
17bf0 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74  t written back t
17c00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
17c10 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a   Thus in-page.**
17c20 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74   deleted content
17c30 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74   is cleared, but
17c40 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65   freelist delete
17c50 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  d content is not
17c60 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53  ..**.** With BTS
17c70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20  _SECURE_DELETE, 
17c80 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b  operation is lik
17c90 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  e BTS_OVERWRITE 
17ca0 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
17cb0 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69  n.** that freeli
17cc0 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61 72  st leaf pages ar
17cd0 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  e written back i
17ce0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17cf0 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20  , increasing.** 
17d00 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69  the amount of di
17d10 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73  sk I/O..*/.int s
17d20 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
17d30 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
17d40 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
17d50 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
17d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17d70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17d80 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
17d90 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d  ( BTS_OVERWRITE=
17da0 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  =BTS_SECURE_DELE
17db0 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74  TE*2 );.  assert
17dc0 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52  ( BTS_FAST_SECUR
17dd0 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54  E==(BTS_OVERWRIT
17de0 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  E|BTS_SECURE_DEL
17df0 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65  ETE) );.  if( ne
17e00 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
17e10 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17e20 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45   &= ~BTS_FAST_SE
17e30 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74  CURE;.    p->pBt
17e40 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17e50 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a  S_SECURE_DELETE*
17e60 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62  newFlag;.  }.  b
17e70 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
17e80 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
17e90 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55  SECURE)/BTS_SECU
17ea0 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c  RE_DELETE;.  sql
17eb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17ec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
17ed0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17ee0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
17ef0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
17f00 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
17f10 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
17f20 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
17f30 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
17f40 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
17f50 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
17f60 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
17f70 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
17f80 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
17f90 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
17fa0 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
17fb0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
17fc0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
17fd0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
17fe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17ff0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
18000 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
18010 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
18020 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18030 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
18040 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
18050 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
18060 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18070 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
18080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
18090 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
180a0 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
180b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
180c0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
180d0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
180e0 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
180f0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
18100 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
18110 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
18120 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
18130 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
18140 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
18150 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
18160 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
18170 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
18180 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18190 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
181a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
181b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
181c0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
181d0 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
181e0 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
181f0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
18200 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
18210 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
18220 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
18230 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
18240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
18250 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
18260 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
18270 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
18280 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
18290 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
182a0 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
182b0 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
182c0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
182d0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
182e0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
182f0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
18300 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
18310 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
18320 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
18330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18340 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18350 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
18360 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
18370 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  has not set the 
18380 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72  safety-level for
18390 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
183a0 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69  onnection.** usi
183b0 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68  ng "PRAGMA synch
183c0 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20  ronous", and if 
183d0 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c  the safety-level
183e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
183f0 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  ** set to the va
18400 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68  lue passed to th
18410 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74  is function as t
18420 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
18430 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73  ter,.** set it s
18440 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
18450 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
18460 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46  NOUS!=SQLITE_DEF
18470 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
18480 4e 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64  NOUS.static void
18490 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
184a0 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42  lag(BtShared *pB
184b0 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76  t, u8 safety_lev
184c0 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  el){.  sqlite3 *
184d0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  db;.  Db *pDb;. 
184e0 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62   if( (db=pBt->db
184f0 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d  )!=0 && (pDb=db-
18500 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  >aDb)!=0 ){.    
18510 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d  while( pDb->pBt=
18520 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e  =0 || pDb->pBt->
18530 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b  pBt!=pBt ){ pDb+
18540 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62  +; }.    if( pDb
18550 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20  ->bSyncSet==0 . 
18560 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65      && pDb->safe
18570 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79  ty_level!=safety
18580 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20  _level .     && 
18590 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d  pDb!=&db->aDb[1]
185a0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70   .    ){.      p
185b0 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
185c0 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b   = safety_level;
185d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
185e0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
185f0 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  >pPager,.       
18600 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
18610 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67  evel | (db->flag
18620 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f  s & PAGER_FLAGS_
18630 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  MASK));.    }.  
18640 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
18650 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e  ne setDefaultSyn
18660 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79  cFlag(pBt,safety
18670 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a  _level).#endif..
18680 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
18690 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
186a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
186b0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
186c0 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
186d0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
186e0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
186f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18700 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
18710 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
18720 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
18730 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
18740 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
18750 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
18760 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
18770 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
18780 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
18790 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
187a0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
187b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
187c0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
187d0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
187e0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
187f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
18800 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
18810 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
18820 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
18830 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
18840 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
18850 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
18860 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
18870 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
18880 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18890 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
188a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
188b0 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
188c0 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
188d0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
188e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
188f0 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
18900 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
18910 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18920 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
18930 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
18940 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18950 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18960 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18970 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
18980 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
18990 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
189a0 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
189b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
189c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
189d0 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
189e0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
189f0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
18a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18a10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
18a20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
18a30 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
18a40 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
18a50 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
18a60 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
18a70 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
18a80 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
18a90 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
18aa0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
18ab0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
18ac0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
18ad0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
18ae0 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
18af0 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
18b00 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
18b10 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
18b20 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
18b30 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
18b40 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
18b50 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
18b60 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
18b70 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
18b80 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
18b90 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
18ba0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
18bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
18bc0 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
18bd0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
18be0 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
18bf0 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
18c00 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
18c10 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
18c20 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
18c30 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
18c40 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
18c50 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
18c60 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
18c70 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
18c80 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
18c90 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
18ca0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
18cb0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18cc0 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
18cd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
18ce0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
18cf0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
18d00 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
18d10 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
18d20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
18d30 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
18d40 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18d50 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
18d60 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
18d70 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
18d80 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
18d90 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
18da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18db0 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
18dc0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18dd0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18de0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
18df0 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
18e00 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
18e10 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
18e20 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
18e30 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
18e40 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
18e50 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
18e60 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
18e70 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
18e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
18e90 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
18ea0 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
18eb0 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
18ec0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
18ed0 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
18ee0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
18ef0 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
18f00 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
18f10 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
18f20 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
18f30 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
18f40 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
18f50 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
18f60 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
18f70 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
18f80 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
18f90 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
18fa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18fb0 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
18fc0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
18fd0 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
18fe0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
18ff0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
19000 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19010 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
19020 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
19030 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19050 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19060 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
19070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
19080 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
19090 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45  g(pBt, SQLITE_DE
190a0 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
190b0 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20  ONOUS+1);.      
190c0 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
190d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
190e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
190f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
19100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19120 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19130 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
19140 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
19150 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
19160 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
19170 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
19180 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
19190 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
191a0 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
191b0 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
191c0 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
191d0 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
191e0 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
191f0 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
19200 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
19210 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
19220 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
19230 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
19240 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
19250 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
19260 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
19270 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
19280 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
19290 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
192a0 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
192b0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
192c0 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
192d0 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
192e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
192f0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19300 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
19310 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
19320 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
19330 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
19340 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
19350 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19360 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
19370 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
19380 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
19390 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
193a0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
193b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
193c0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
193d0 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
193e0 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
193f0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
19400 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19410 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
19420 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
19430 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
19440 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
19450 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
19460 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
19470 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
19480 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
19490 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
194a0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
194b0 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
194c0 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
194d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
194e0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
194f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19500 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
19510 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
19520 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
19530 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
19540 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
19550 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
19560 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
19570 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
19580 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19590 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
195a0 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
195b0 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
195c0 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
195d0 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
195e0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
195f0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
19600 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
19610 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
19620 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
19630 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
19640 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
19650 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
19660 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
19670 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
19680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
19690 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
196a0 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
196b0 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
196c0 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
196d0 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
196e0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
196f0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
19700 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19710 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
19720 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
19730 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
19740 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
19750 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
19760 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
19770 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
19780 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
19790 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
197a0 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
197b0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
197c0 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
197d0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
197e0 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
197f0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
19800 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
19810 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
19820 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
19830 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
19840 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
19850 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
19860 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
19870 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
19880 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
19890 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
198a0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
198b0 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
198c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
198d0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
198e0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
198f0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
19920 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
19930 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19940 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
19950 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
19960 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
19970 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  ma)==0 && nPage>
19980 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
19990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
199a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
199b0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
199c0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
199d0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
199e0 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
199f0 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19a00 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19a10 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
19a20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
19a30 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
19a40 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
19a50 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
19a60 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
19a70 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
19a80 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
19a90 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
19aa0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
19ab0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19ac0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19ad0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19ae0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19af0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19b00 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19b10 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
19b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19b30 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
19b40 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
19b50 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
19b60 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
19b70 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
19b80 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
19b90 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
19ba0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
19bb0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
19bc0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
19bd0 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
19be0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19bf0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19c00 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19c10 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19c20 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19c30 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19c40 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19c50 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19c60 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
19c70 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
19c80 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
19c90 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
19ca0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
19cb0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
19cc0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19cd0 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
19ce0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19cf0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19d00 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19d10 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19d20 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19d30 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19d40 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19d50 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19d60 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
19d70 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
19d80 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
19d90 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
19da0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
19db0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
19dc0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
19dd0 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
19de0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19df0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19e00 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19e10 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19e20 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19e30 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19e40 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19e50 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19e60 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19e70 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19e80 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
19e90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
19ea0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
19eb0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
19ec0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
19ed0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
19ee0 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
19ef0 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
19f00 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19f10 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
19f20 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19f30 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
19f40 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
19f50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
19f60 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
19f70 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
19f80 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
19f90 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19fa0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19fb0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19fd0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19fe0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19ff0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
1a000 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
1a010 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1a020 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1a030 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1a040 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
1a050 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
1a060 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1a070 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1a080 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1a090 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1a0a0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1a0b0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
1a0c0 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
1a0d0 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
1a0e0 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
1a0f0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
1a100 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
1a110 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1a120 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
1a130 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
1a140 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
1a150 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1a160 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1a170 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
1a180 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
1a190 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
1a1a0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
1a1b0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1a1c0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1a1d0 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1a1e0 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1a1f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1a200 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1a210 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1a220 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1a230 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1a240 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1a250 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1a260 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1a270 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a280 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1a290 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1a2a0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1a2b0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1a2c0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1a2d0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1a2e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1a2f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a300 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1a310 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1a320 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1a330 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1a340 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1a350 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1a360 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1a370 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1a380 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1a390 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1a3a0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1a3b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a3c0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1a3d0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1a3e0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1a3f0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1a400 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1a410 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1a420 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a430 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1a440 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1a450 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1a460 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a480 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a490 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a4a0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1a4b0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1a4c0 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1a4d0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1a4e0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a4f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a500 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a510 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a520 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a530 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a540 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a550 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a560 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a570 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a580 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a590 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a5a0 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a5b0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a5c0 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a5d0 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a5e0 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a5f0 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a600 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a610 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a620 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a630 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a640 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a650 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a670 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a680 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a690 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a6a0 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a6b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a6c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a6d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a6e0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a6f0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a710 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a720 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a730 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a740 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a750 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a760 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a770 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a780 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a790 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a7a0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a7b0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a7c0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a7d0 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a7e0 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a7f0 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a800 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a810 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a820 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a830 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a840 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a850 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a860 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a870 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a880 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a890 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1a8a0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1a8b0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a8c0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1a8d0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1a8e0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1a8f0 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1a900 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1a910 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1a920 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1a930 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1a940 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1a950 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1a960 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1a970 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1a980 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a990 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1a9a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a9b0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1a9c0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1a9d0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1a9e0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1a9f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1aa00 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1aa10 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1aa20 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1aa30 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1aa40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1aa50 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1aa60 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1aa70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1aa80 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1aa90 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1aaa0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1aab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1aac0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1aad0 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1aae0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1aaf0 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1ab00 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1ab10 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1ab20 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1ab30 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1ab40 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1ab50 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1ab60 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1ab70 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1ab80 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1ab90 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1aba0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1abb0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1abc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1abd0 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1abe0 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1abf0 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1ac00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ac10 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1ac20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1ac30 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1ac40 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1ac50 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1ac60 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1ac70 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1ac80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1ac90 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1aca0 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1acb0 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1acc0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1acd0 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1ace0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1acf0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1ad00 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1ad10 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1ad20 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1ad30 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1ad40 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1ad50 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1ad60 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1ad70 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1ad80 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1ad90 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1ada0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1adb0 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1adc0 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1add0 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1ade0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1adf0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1ae00 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1ae10 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1ae20 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1ae30 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1ae40 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1ae50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1ae60 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1ae70 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1ae80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1ae90 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1aea0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1aeb0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1aec0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1aed0 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1aee0 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1aef0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1af00 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1af10 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1af20 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1af30 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1af40 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1af50 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1af60 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1af70 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1af80 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1af90 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1afa0 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1afb0 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1afc0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1afd0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1afe0 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1aff0 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1b000 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1b010 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1b020 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1b030 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1b040 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1b050 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1b060 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1b070 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1b080 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1b090 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1b0a0 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1b0b0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1b0c0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1b0d0 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1b0e0 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1b0f0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1b100 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1b110 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1b120 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1b130 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1b140 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1b150 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1b160 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1b170 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1b180 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1b190 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1b1a0 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1b1b0 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1b1c0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1b1d0 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1b1e0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1b1f0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1b200 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1b210 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1b220 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1b230 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1b240 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1b250 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1b260 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1b270 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1b280 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1b290 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1b2a0 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1b2b0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1b2c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1b2d0 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1b2e0 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1b2f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b300 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1b310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b320 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1b330 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1b340 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1b350 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1b360 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1b370 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1b380 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1b390 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1b3a0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1b3b0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1b3c0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1b3d0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1b3e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1b3f0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1b400 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1b410 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1b420 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1b430 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1b440 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b450 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1b460 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b470 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1b480 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1b490 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1b4a0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1b4b0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1b4c0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1b4d0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1b4e0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1b4f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b500 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1b510 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1b520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1b530 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1b540 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b550 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1b560 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b570 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1b580 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1b590 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1b5a0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1b5b0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1b5c0 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1b5d0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1b5e0 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1b5f0 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1b600 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1b610 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b620 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1b630 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1b640 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1b650 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1b660 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b670 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b680 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1b690 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b6a0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1b6b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1b6c0 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1b6d0 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1b6e0 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1b6f0 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1b700 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1b710 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1b720 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1b730 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1b740 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1b750 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1b760 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1b770 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b780 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1b790 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1b7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b7b0 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1b7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1b7d0 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1b7e0 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1b7f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b800 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1b810 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1b820 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1b830 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1b840 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1b850 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1b860 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1b870 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1b880 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1b890 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1b8a0 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1b8b0 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1b8c0 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1b8d0 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1b8e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b8f0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1b900 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1b910 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1b920 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1b930 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1b940 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1b950 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1b960 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1b970 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1b980 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1b990 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1b9a0 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1b9b0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1b9c0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1b9d0 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1b9e0 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1b9f0 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1ba00 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1ba10 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1ba20 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1ba30 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1ba40 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1ba50 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1ba60 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1ba70 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1ba80 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1ba90 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1baa0 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1bab0 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1bac0 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1bad0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1bae0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1baf0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1bb00 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1bb10 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1bb20 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1bb30 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1bb40 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1bb50 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1bb60 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1bb70 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1bb80 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1bb90 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1bba0 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1bbb0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1bbc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1bbd0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1bbe0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1bbf0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1bc00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1bc10 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1bc20 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1bc30 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1bc40 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1bc50 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1bc60 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1bc70 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1bc80 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1bc90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bca0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1bcb0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1bcc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bcd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1bce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bcf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1bd00 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1bd10 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1bd20 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1bd30 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1bd40 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bd50 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1bd60 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1bd70 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1bd80 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1bd90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bda0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1bdb0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1bdc0 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1bdd0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1bde0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bdf0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1be00 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1be10 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1be20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1be30 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1be40 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1be50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1be60 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1be70 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1be80 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1be90 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1bea0 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1beb0 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1bec0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1bed0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1bee0 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1bef0 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1bf00 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1bf10 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1bf20 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1bf30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bf40 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1bf50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1bf60 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1bf70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1bf80 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1bf90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bfa0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bfb0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1bfc0 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1bfd0 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1bfe0 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1bff0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1c000 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1c010 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1c020 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1c030 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1c040 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1c050 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1c060 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1c070 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1c080 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1c090 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1c0a0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1c0b0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1c0c0 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1c0d0 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1c0e0 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1c0f0 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1c100 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1c110 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1c120 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1c130 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1c140 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1c150 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1c160 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1c170 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1c180 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1c190 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1c1a0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1c1b0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1c1c0 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1c1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1c1e0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1c1f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1c200 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1c210 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1c220 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1c240 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1c250 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1c260 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1c270 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c280 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1c290 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1c2a0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1c2b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1c2c0 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1c2d0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1c2e0 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1c2f0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1c300 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1c310 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1c320 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1c330 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1c340 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1c350 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1c360 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1c370 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1c380 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1c390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c3a0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1c3b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1c3c0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1c3d0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1c3e0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1c3f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c400 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c410 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1c420 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c430 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1c440 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1c450 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1c460 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1c470 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1c480 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1c490 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1c4a0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c4b0 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1c4c0 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1c4d0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1c4e0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1c4f0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1c500 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1c510 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1c520 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1c550 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1c560 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c590 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1c5a0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1c5b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c5d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c5e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c5f0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1c600 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1c610 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1c620 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c630 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1c640 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1c650 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  c = pPage->isIni
1c660 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  t ? SQLITE_OK : 
1c670 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1c680 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1c690 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1c6a0 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d  rn rc;.  nCell =
1c6b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1c6c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1c6d0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1c6e0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1c6f0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1c700 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1c710 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1c720 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
1c730 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1c740 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
1c750 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1c760 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
1c770 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1c780 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1c790 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1c7a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c7b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1c7c0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
1c7d0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1c7e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1c7f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1c800 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
1c810 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1c820 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1c830 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1c840 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c850 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
1c860 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
1c870 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
1c880 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
1c890 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
1c8a0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1c8b0 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
1c8c0 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
1c8d0 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
1c8e0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
1c8f0 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
1c900 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
1c910 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
1c920 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1c930 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1c940 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
1c950 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
1c960 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1c970 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
1c980 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1c990 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
1c9a0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1c9b0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1c9c0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9e0 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
1c9f0 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
1ca00 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
1ca10 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1ca20 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
1ca30 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
1ca40 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1ca50 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
1ca60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1ca70 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
1ca80 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
1ca90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1caa0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1cab0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1cac0 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
1cad0 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
1cae0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1caf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1cb00 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1cb10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1cb20 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1cb30 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
1cb40 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
1cb50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1cb60 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
1cb70 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
1cb80 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
1cb90 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
1cba0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1cbb0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
1cbc0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1cbd0 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
1cbe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cbf0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
1cc00 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
1cc10 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1cc20 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1cc30 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1cc40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1cc50 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1cc60 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   rc;..    rc = p
1cc70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53  Page->isInit ? S
1cc80 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65  QLITE_OK : btree
1cc90 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1cca0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1ccb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65  turn rc;.    nCe
1ccc0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1ccd0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
1cce0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1ccf0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
1cd00 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1cd10 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1cd20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1cd30 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
1cd40 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1cd50 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
1cd60 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
1cd70 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1cd80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
1cd90 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
1cda0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
1cdb0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69       if( pCell+i
1cdc0 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67  nfo.nSize > pPag
1cdd0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1cde0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1cdf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1ce00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1ce10 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
1ce20 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1ce30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1ce40 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
1ce50 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1ce60 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ze-4) ){.       
1ce70 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1ce80 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1ce90 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1cea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ceb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1cec0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ced0 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1cee0 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1cef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1cf00 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1cf10 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1cf20 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1cf30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1cf40 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1cf50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1cf60 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1cf70 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1cf80 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1cf90 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1cfa0 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1cfb0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1cfc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1cfd0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
1cfe0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
1cff0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1d000 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d010 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1d020 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iTo);.    }.  }
1d030 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d040 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1d050 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1d060 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d070 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1d080 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1d090 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1d0a0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1d0b0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1d0c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1d0d0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1d0e0 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1d0f0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1d100 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1d110 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1d120 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1d130 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1d140 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1d150 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1d160 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1d170 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1d180 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1d190 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1d1a0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1d1b0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1d1c0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1d1d0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1d1e0 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1d1f0 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1d200 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1d210 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1d220 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1d230 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1d240 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1d250 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1d260 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1d270 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1d280 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1d290 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1d2a0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1d2b0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1d2c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1d2d0 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1d2e0 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1d2f0 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1d300 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1d310 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1d320 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1d330 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1d340 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1d350 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1d360 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1d370 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1d380 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1d390 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1d3a0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1d3b0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1d3c0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1d3d0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1d3e0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1d3f0 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1d400 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1d410 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1d420 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1d430 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1d440 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1d450 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d460 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d470 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1d480 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1d490 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1d4a0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1d4b0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1d4c0 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1d4d0 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1d4e0 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1d4f0 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1d500 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1d510 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1d520 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1d530 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1d540 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1d550 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1d560 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1d570 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1d580 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1d590 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1d5a0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1d5b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d5c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d5d0 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1d5e0 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1d5f0 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1d600 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1d610 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1d620 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1d630 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1d640 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1d650 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1d660 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1d670 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1d680 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1d690 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1d6a0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1d6b0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1d6c0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1d6d0 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1d6e0 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1d6f0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1d700 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1d710 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1d720 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1d730 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1d740 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1d750 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1d760 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1d770 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1d780 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1d790 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1d7a0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1d7b0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1d7c0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1d7d0 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1d7e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d7f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d800 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1d820 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1d830 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1d840 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1d850 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1d860 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1d870 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1d880 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1d890 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1d8a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d8b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d8c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d8d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d8e0 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1d8f0 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1d900 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1d910 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1d920 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1d930 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1d940 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1d950 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1d960 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1d970 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1d980 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1d990 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1d9a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1d9b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1d9c0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1d9d0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1d9e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d9f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1da00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1da10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1da20 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1da30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1da40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1da50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1da60 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1da70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1da80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1da90 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1daa0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1dab0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1dac0 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1dad0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1dae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1daf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1db00 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1db10 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1db20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1db30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1db40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1db50 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1db60 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1db70 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1db80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1db90 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1dba0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1dbb0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1dbc0 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1dbd0 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1dbe0 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1dbf0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1dc00 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1dc10 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1dc20 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1dc30 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1dc40 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1dc50 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1dc60 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1dc70 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1dc80 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1dc90 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1dca0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1dcb0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1dcc0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1dcd0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1dce0 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1dcf0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1dd00 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1dd10 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1dd20 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1dd30 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1dd40 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1dd50 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1dd60 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1dd70 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1dd80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1dd90 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1dda0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1ddb0 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1ddc0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1ddd0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1dde0 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1ddf0 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1de00 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1de10 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1de20 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1de30 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1de40 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1de50 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1de60 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1de70 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1de80 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1de90 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1dea0 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1deb0 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1dec0 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1ded0 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1dee0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1def0 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1df00 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1df10 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1df20 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1df30 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1df40 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1df50 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1df60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1df70 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1df80 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1df90 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1dfa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1dfb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1dfc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1dfd0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1dfe0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1dff0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e000 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1e010 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1e020 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1e030 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1e040 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1e050 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1e060 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e070 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e080 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1e090 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1e0a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e0b0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1e0c0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1e0d0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1e0e0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1e0f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e110 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e120 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1e130 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e140 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e150 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e160 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1e170 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1e180 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1e190 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1e1a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1e1b0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1e1c0 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1e1d0 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1e1e0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1e1f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1e200 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1e210 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1e220 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1e230 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1e240 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1e250 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1e260 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1e270 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1e280 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1e290 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1e2a0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1e2b0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1e2c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e2d0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1e2e0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1e2f0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1e300 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1e310 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1e320 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1e330 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1e340 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1e350 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e360 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e370 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1e390 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1e3a0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1e3b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1e3c0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1e3d0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1e3e0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e400 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1e410 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1e420 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1e430 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1e440 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1e450 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1e460 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1e470 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1e480 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1e490 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1e4a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1e4b0 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1e4c0 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1e4d0 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1e4e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1e4f0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1e500 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1e510 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e530 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e540 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e550 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1e560 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1e570 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1e580 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1e590 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1e5a0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1e5b0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1e5c0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1e5d0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1e5e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1e5f0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1e600 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1e610 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1e620 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1e630 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1e640 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1e650 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1e660 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1e670 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1e680 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1e690 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1e6a0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1e6b0 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1e6c0 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1e6d0 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1e6e0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1e6f0 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1e700 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1e710 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1e720 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1e730 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1e740 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1e750 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1e760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1e780 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1e790 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1e7a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1e7b0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1e7c0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1e7d0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1e7e0 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1e7f0 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1e800 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1e810 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1e820 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1e830 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1e840 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1e850 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1e860 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1e870 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1e880 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1e890 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e8a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e8b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1e8c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1e8d0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1e8e0 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1e8f0 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1e900 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1e910 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e920 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1e930 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1e940 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1e950 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1e960 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1e970 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1e980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1e9a0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1e9b0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1e9c0 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1e9d0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1e9e0 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1e9f0 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1ea00 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1ea10 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1ea20 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1ea30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ea40 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1ea50 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1ea60 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1ea70 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1ea80 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1ea90 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1eaa0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1eab0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1eae0 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1eaf0 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1eb00 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1eb30 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1eb40 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1eb50 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1eb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1eb70 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1eb80 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1eb90 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1eba0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1ebb0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1ebc0 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1ebd0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1ebe0 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1ebf0 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1ec00 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1ec10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ec20 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1ec30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ec40 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1ec50 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1ec60 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1ec70 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1ec80 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ec90 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1eca0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1ecb0 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1ecc0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1ecd0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1ece0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1ecf0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ed00 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1ed10 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1ed20 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1ed30 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1ed40 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1ed50 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1ed60 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1ed70 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1ed80 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1ed90 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1eda0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1edb0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1edc0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1edd0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1ede0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1edf0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1ee00 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1ee10 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1ee20 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1ee30 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1ee40 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1ee50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1ee60 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1ee70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1ee80 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1ee90 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1eea0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1eeb0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1eec0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1eed0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1eee0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1eef0 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1ef00 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1ef10 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1ef20 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1ef30 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1ef40 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ef50 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1ef60 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1ef70 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1ef80 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1ef90 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1efa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1efb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1efc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1efd0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1efe0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1eff0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1f000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f020 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1f030 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1f040 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1f050 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1f060 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1f070 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1f080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f0a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f0b0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f0c0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f0d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f0e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f0f0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1f100 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1f110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f120 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1f130 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1f140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f150 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f160 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f170 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1f180 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1f190 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1f1a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1f1b0 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1f1c0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1f1d0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1f1e0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1f1f0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1f200 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1f210 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1f220 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1f230 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1f240 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1f250 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1f260 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1f270 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1f280 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1f290 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1f2a0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1f2b0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1f2c0 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1f2d0 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1f2e0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1f2f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1f300 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f310 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1f320 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1f330 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1f340 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1f350 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1f360 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
1f370 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f380 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1f390 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1f3a0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1f3b0 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1f3c0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1f3d0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1f3e0 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1f3f0 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1f400 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f410 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1f420 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1f430 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1f440 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1f450 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1f460 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1f470 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1f480 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1f490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1f4a0 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1f4b0 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1f4c0 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1f4d0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1f4e0 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1f4f0 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1f500 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1f510 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1f520 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1f530 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1f540 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f550 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1f560 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1f570 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1f580 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1f590 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1f5a0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1f5b0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1f5c0 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1f5d0 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1f5e0 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1f5f0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1f600 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1f610 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1f620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1f630 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f640 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1f650 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1f660 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1f670 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1f680 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1f690 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1f6a0 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1f6b0 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1f6c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f6d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1f6e0 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1f6f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1f700 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1f710 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1f720 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1f730 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1f740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1f750 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1f760 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1f770 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1f780 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1f790 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1f7a0 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1f7b0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1f7c0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1f7d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f7e0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f7f0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f800 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1f810 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1f820 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1f830 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1f840 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1f850 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1f860 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f870 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1f880 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1f890 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1f8a0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1f8b0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1f8c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f8d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1f8e0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1f8f0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1f900 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1f910 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1f920 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1f930 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1f940 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1f950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f960 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1f970 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1f980 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1f990 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1f9a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f9b0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1f9c0 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1f9d0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1f9e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1f9f0 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1fa00 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1fa10 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1fa20 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1fa30 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1fa40 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1fa50 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1fa60 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1fa70 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1fa80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1fa90 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1faa0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1fab0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1fac0 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1fad0 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1fae0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1faf0 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1fb00 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1fb10 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1fb20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1fb30 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1fb40 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1fb50 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1fb60 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fb70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1fb80 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1fb90 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1fba0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1fbb0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1fbc0 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1fbd0 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1fbe0 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1fbf0 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1fc00 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1fc10 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1fc20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1fc30 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1fc40 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1fc50 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1fc60 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1fc70 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1fc80 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1fc90 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1fca0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1fcb0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1fcc0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1fcd0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1fce0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1fcf0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1fd00 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1fd10 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1fd20 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1fd30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fd40 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1fd50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fd60 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1fd70 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1fd80 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1fd90 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1fda0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1fdb0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1fdc0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1fdd0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1fde0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1fdf0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1fe00 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1fe10 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1fe20 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1fe30 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1fe40 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1fe50 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1fe60 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1fe70 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1fe80 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1fe90 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1fea0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1feb0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1fec0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1fed0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1fee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1fef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ff00 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ff10 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1ff20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1ff30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ff40 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1ff50 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1ff60 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1ff70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ff80 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1ff90 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1ffa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ffb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1ffc0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1ffd0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1ffe0 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1fff0 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20010 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20020 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20030 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20040 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20050 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20060 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
20070 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20080 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
20090 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
200a0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
200b0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
200c0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
200d0 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
200e0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
200f0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20100 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20110 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20120 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20130 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20140 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
20150 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
20160 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
20170 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
20180 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
20190 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
201a0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
201b0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
201c0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
201d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
201e0 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
201f0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
20200 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
20210 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
20220 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20230 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20240 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
20250 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
20260 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
20270 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
20280 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
20290 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
202a0 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
202b0 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
202c0 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
202d0 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
202e0 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
202f0 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
20300 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
20310 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
20320 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
20330 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
20340 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20350 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
20360 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
20370 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
20380 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
20390 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
203a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
203b0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
203c0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
203d0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
203e0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
203f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20400 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
20410 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
20420 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20430 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
20440 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
20450 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
20460 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
20470 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
20480 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
20490 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
204a0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
204b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
204c0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
204d0 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
204e0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
204f0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
20500 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
20510 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
20520 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
20530 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
20540 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
20550 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
20560 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20570 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
20580 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
20590 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
205a0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
205b0 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
205c0 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
205d0 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
205e0 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
205f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
20600 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
20610 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
20620 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
20630 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
20640 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
20650 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
20660 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
20670 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
20680 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
20690 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
206a0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
206b0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
206c0 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
206d0 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
206e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
206f0 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
20700 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
20710 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
20720 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
20730 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
20740 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
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 29 0a 2a 2a  mitPhaseOne().**
20770 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
20780 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
20790 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
207a0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
207b0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
207c0 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
207d0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
207e0 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
207f0 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
20800 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
20810 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
20820 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
20830 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
20840 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
20850 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20860 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
20870 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
20880 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
20890 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
208a0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
208b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
208c0 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
208d0 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
208e0 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
208f0 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
20900 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
20910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
20920 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
20930 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
20940 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
20950 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
20960 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
20970 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
20980 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
20990 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
209a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
209b0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
209c0 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
209d0 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
209e0 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
209f0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
20a00 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
20a10 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
20a20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20a30 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
20a40 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
20a50 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
20a60 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
20a70 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
20a80 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
20a90 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
20aa0 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
20ab0 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
20ac0 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
20ad0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20ae0 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
20af0 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
20b00 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
20b10 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
20b20 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
20b30 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
20b40 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
20b50 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
20b60 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
20b70 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
20b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20b90 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
20ba0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
20bb0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
20bc0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
20bd0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
20be0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
20bf0 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
20c00 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
20c10 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
20c20 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
20c30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20c40 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
20c50 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
20c60 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
20c70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
20c80 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
20c90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
20ca0 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
20cb0 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
20cc0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
20cd0 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
20ce0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
20cf0 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
20d00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
20d10 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
20d20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
20d30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20d40 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
20d50 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20d60 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
20d70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20d80 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
20d90 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
20da0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20db0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
20dc0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
20dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
20de0 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
20df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
20e00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
20e10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20e20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
20e30 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
20e40 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
20e50 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
20e60 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
20e70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
20e80 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
20e90 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
20ea0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
20eb0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
20ec0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
20ed0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20ee0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20ef0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20f00 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
20f10 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
20f20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
20f30 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
20f40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
20f50 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20f60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
20f70 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20f80 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
20f90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20fa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
20fb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
20fc0 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
20fd0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
20fe0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
20ff0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21000 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21010 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21020 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21030 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
21040 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
21050 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
21060 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
21070 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
21080 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
21090 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
210a0 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
210b0 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
210c0 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
210d0 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
210e0 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
210f0 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21100 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21110 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21120 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21130 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
21140 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
21150 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21160 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
21170 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
21180 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
21190 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
211a0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
211b0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
211c0 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
211d0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
211e0 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
211f0 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
21200 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
21210 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
21220 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
21230 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
21240 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
21250 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
21260 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
21270 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
21280 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
21290 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
212a0 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
212b0 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
212c0 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
212d0 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
212e0 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
212f0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21300 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
21310 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
21320 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
21330 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
21340 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
21350 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
21360 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
21370 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
21380 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
21390 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
213a0 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
213b0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
213c0 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
213d0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
213e0 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
213f0 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
21400 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
21410 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21420 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
21430 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
21440 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
21450 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
21460 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
21470 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
21480 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
21490 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
214a0 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
214b0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
214c0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
214d0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
214e0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
214f0 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
21500 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
21510 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
21520 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
21530 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
21540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
21550 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
21560 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
21570 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
21580 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
21590 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
215a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
215b0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
215c0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
215d0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
215e0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
215f0 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
21600 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
21610 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
21620 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21630 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
21640 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
21650 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21660 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
21670 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
21680 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
21690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
216a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
216b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
216c0 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
216d0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
216e0 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
216f0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21700 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21720 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
21730 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
21740 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
21750 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
21760 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
21770 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
21780 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
21790 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
217a0 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
217b0 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
217c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
217d0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
217e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
217f0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
21800 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
21810 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
21820 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
21830 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
21840 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
21850 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
21860 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
21870 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
21880 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
21890 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
218a0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
218b0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
218c0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
218d0 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
218e0 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
218f0 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
21900 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
21910 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
21920 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
21930 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
21940 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21950 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
21960 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
21970 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
21980 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
21990 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
219a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
219b0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
219c0 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
219d0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
219e0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
219f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21a00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21a10 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
21a20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
21a30 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
21a40 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
21a50 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
21a60 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
21a70 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
21a80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
21a90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
21aa0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
21ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
21ac0 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
21ad0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
21ae0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
21af0 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
21b00 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
21b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21b20 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
21b30 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
21b40 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
21b50 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
21b60 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
21b70 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
21b80 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
21b90 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
21ba0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
21bb0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
21bc0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
21bd0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
21be0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
21bf0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
21c00 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21c10 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
21c20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
21c30 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
21c40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21c50 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
21c60 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
21c70 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
21c80 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
21c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21ca0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
21cb0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
21cc0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
21cd0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
21ce0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
21cf0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
21d00 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
21d10 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
21d20 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
21d30 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
21d40 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
21d50 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
21d60 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
21d70 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
21d80 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
21d90 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
21da0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
21db0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
21dc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21dd0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
21de0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
21df0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
21e00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
21e10 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21e20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21e30 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
21e40 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
21e50 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
21e60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21e70 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
21e80 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
21e90 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
21ea0 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
21eb0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21ec0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
21ed0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
21ee0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
21ef0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
21f00 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
21f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21f20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21f30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
21f40 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
21f50 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
21f60 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
21f70 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
21f80 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
21f90 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
21fa0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
21fb0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
21fc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
21fd0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
21fe0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
21ff0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
22000 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
22010 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
22020 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
22030 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
22040 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
22050 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
22060 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
22070 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
22080 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
22090 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
220a0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
220b0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
220c0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
220d0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
220e0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
220f0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
22100 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
22110 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
22120 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
22130 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
22140 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
22150 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
22160 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
22170 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
22180 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
22190 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
221a0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
221b0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
221c0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
221d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
221e0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
221f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
22200 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
22210 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
22220 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
22230 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
22240 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
22250 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
22260 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
22270 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
22280 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
22290 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
222a0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
222b0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
222c0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
222d0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
222e0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
222f0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
22300 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
22310 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
22320 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
22330 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
22340 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
22350 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
22360 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22370 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
22380 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
22390 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
223a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
223b0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
223c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
223d0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
223e0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
223f0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
22400 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
22410 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
22420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22430 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
22440 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22450 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
22460 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
22470 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
22480 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
22490 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
224a0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
224b0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
224c0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
224d0 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
224e0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
224f0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
22500 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
22510 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
22520 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
22530 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
22540 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
22550 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
22560 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
22570 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
22580 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
22590 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
225a0 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
225b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
225c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
225d0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
225e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
225f0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
22600 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
22610 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
22620 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
22630 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
22640 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
22650 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
22660 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
22670 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
22680 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
22690 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
226a0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
226b0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
226c0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
226d0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
226e0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
226f0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
22700 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
22710 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
22720 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
22730 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
22740 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
22750 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
22760 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
22770 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
22780 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
22790 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
227a0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
227b0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
227c0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
227d0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
227e0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
227f0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
22800 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22810 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
22820 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
22830 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
22840 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22850 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
22860 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22870 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
22880 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22890 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
228a0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
228b0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
228c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
228d0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
228e0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
228f0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
22900 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
22910 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
22920 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22930 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66  Enter(p);.    if
22940 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
22950 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
22960 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
22970 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
22980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
229a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
229b0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
229c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
229d0 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
229e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
229f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22a00 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
22a10 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
22a20 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
22a30 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
22a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
22a50 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
22a60 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
22a70 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
22a80 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
22a90 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
22aa0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
22ab0 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
22ac0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
22ad0 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
22ae0 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
22af0 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
22b00 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
22b10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
22b20 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
22b30 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
22b40 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
22b50 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
22b60 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
22b70 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
22b80 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
22b90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22ba0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
22bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22bc0 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
22bd0 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
22be0 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
22bf0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
22c00 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
22c10 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
22c20 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
22c30 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
22c40 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
22c50 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
22c60 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
22c70 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
22c80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22c90 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
22ca0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
22cb0 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
22cc0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
22cd0 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
22ce0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
22cf0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22d00 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
22d10 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
22d20 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
22d30 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
22d40 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
22d50 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
22d60 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
22d70 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
22d80 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
22d90 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
22da0 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
22db0 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
22dc0 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
22dd0 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
22de0 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
22df0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
22e00 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
22e10 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
22e20 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
22e30 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
22e40 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
22e50 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
22e60 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
22e70 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
22e80 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
22e90 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
22ea0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
22eb0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
22ec0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
22ed0 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
22ee0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
22ef0 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
22f00 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
22f10 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
22f20 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
22f30 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
22f40 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
22f50 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
22f60 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
22f70 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
22f80 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
22f90 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
22fa0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
22fb0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
22fc0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
22fd0 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
22fe0 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
22ff0 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
23000 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
23010 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
23020 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
23030 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
23040 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
23050 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
23060 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
23070 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
23080 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
23090 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
230a0 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
230b0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
230c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
230d0 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
230e0 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
230f0 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
23100 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
23110 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
23120 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
23130 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
23140 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
23150 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
23160 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
23170 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
23180 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
23190 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
231a0 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
231b0 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
231c0 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
231d0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
231e0 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
231f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
23200 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
23210 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
23220 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
23230 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
23240 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
23250 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
23260 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
23270 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
23280 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
23290 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
232a0 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
232b0 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
232c0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
232d0 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
232e0 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
232f0 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
23300 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
23310 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
23320 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
23330 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
23340 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
23350 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
23360 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
23370 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
23380 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
23390 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
233a0 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
233b0 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
233c0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
233d0 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
233e0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
233f0 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
23400 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
23410 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23440 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
23450 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
23480 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
23490 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
234c0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
234d0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
234e0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
234f0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
23500 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
23510 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
23520 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
23530 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23550 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23560 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
23570 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23580 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
23590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
235a0 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
235b0 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
235c0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
235e0 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
235f0 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
23600 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
23610 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
23620 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
23630 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
23640 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
23650 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
23660 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
23670 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
23680 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
23690 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
236a0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
236b0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
236c0 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
236d0 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
236e0 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
236f0 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
23700 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
23710 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
23720 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
23730 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
23740 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
23750 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
23760 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
23770 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
23780 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
23790 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
237a0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
237b0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
237c0 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
237d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
237e0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
237f0 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
23800 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
23810 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
23820 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
23830 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
23840 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
23850 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
23860 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
23870 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
23880 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
23890 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
238a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
238b0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
238c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
238d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
238e0 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
238f0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
23900 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
23910 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
23920 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
23930 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
23940 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
23950 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
23960 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
23970 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
23980 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
23990 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
239a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
239b0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
239c0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
239d0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
239e0 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
239f0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
23a00 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
23a10 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
23a20 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
23a30 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
23a40 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
23a50 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
23a60 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
23a70 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
23a80 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
23a90 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
23aa0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
23ab0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
23ac0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
23ad0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
23ae0 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
23af0 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
23b00 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
23b10 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
23b20 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
23b30 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
23b40 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
23b50 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
23b60 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
23b70 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
23b80 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
23b90 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
23ba0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
23bb0 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
23bc0 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
23bd0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
23be0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
23bf0 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
23c00 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
23c10 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
23c20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
23c30 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
23c40 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
23c50 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
23c60 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
23c70 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
23c80 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
23c90 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
23ca0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
23cb0 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
23cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
23cd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23ce0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
23d20 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23d60 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
23d70 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23da0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
23db0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
23dc0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
23dd0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
23de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23df0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
23e00 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
23e10 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23e40 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
23e50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
23e60 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
23e70 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
23e80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
23ea0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23eb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
23ec0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
23ed0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
23ee0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
23ef0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23f00 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
23f10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23f20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
23f30 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
23f40 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
23f50 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
23f60 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
23f70 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
23f80 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
23f90 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
23fa0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
23fb0 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
23fc0 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
23fd0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
23fe0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
23ff0 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
24000 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
24010 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
24020 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
24030 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
24040 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24050 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
24060 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
24070 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
24080 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
24090 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
240a0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
240b0 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
240c0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
240d0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
240e0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
240f0 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
24100 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
24110 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
24120 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
24130 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
24140 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
24150 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
24160 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
24170 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
24180 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
24190 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
241a0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
241b0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
241c0 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
241d0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
241e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
241f0 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
24200 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
24210 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
24220 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
24230 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
24240 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
24250 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
24260 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
24270 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
24280 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
24290 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
242a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
242b0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
242c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
242d0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
242e0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
242f0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
24300 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
24310 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
24320 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
24330 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
24340 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
24350 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30   pBt->pCursor!=0
24360 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   );.    if( pBt-
24370 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29  >pCursor==pCur )
24380 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
24390 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
243a0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
243b0 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70       BtCursor *p
243c0 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72  Prev = pBt->pCur
243d0 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  sor;.      do{. 
243e0 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
243f0 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b  ->pNext==pCur ){
24400 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76  .          pPrev
24410 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
24420 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
24430 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24440 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  }.        pPrev 
24450 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a  = pPrev->pNext;.
24460 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c        }while( AL
24470 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20  WAYS(pPrev) );. 
24480 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
24490 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
244a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
244b0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
244c0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
244d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
244e0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
244f0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
24500 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
24510 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71  verflow);.    sq
24520 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
24530 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  >pKey);.    sqli
24540 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
24550 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
24560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24570 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
24580 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
24590 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
245a0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
245b0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
245c0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
245d0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
245e0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
245f0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
24600 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
24610 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
24620 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
24630 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
24640 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
24650 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
24660 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
24670 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
24680 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
24690 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
246a0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
246b0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
246c0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
246d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
246e0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
246f0 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
24700 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
24710 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
24720 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
24730 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
24740 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
24750 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
24760 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  >ix, &info);.   
24770 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
24780 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69  _DB || memcmp(&i
24790 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
247a0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
247b0 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
247c0 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
247d0 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
247e0 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  if.static SQLITE
247f0 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67  _NOINLINE void g
24800 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
24810 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
24820 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
24830 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ze==0 ){.    int
24840 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
24850 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Page;.    pCur->
24860 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
24870 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
24880 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
24890 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
248a0 65 5d 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43 75  e],pCur->ix,&pCu
248b0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  r->info);.  }els
248c0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c  e{.    assertCel
248d0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d  lInfo(pCur);.  }
248e0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
248f0 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
24900 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
24910 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
24920 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
24930 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
24940 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
24950 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
24960 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
24970 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
24980 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
24990 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
249a0 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
249b0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
249c0 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
249d0 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
249e0 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
249f0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
24a00 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
24a10 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
24a20 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
24a30 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
24a40 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
24a50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24a60 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
24a70 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  EBUG */.int sqli
24a80 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
24a90 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72  ValidNN(BtCursor
24aa0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
24ab0 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
24ac0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
24ad0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
24ae0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
24af0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
24b00 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
24b10 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61  or "rowid" for a
24b20 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a   table btree..**
24b30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24b40 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
24b50 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
24b60 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61   pointing into a
24b70 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62  .** ordinary tab
24b80 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20 74 68  le btree.  If th
24b90 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
24ba0 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  to an index btre
24bb0 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c  e or.** is inval
24bc0 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f  id, the result o
24bd0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
24be0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
24bf0 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
24c00 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75 72  IntegerKey(BtCur
24c10 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
24c20 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24c30 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24c40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24c50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24c60 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
24c70 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
24c80 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  y );.  getCellIn
24c90 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
24ca0 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  rn pCur->info.nK
24cb0 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ey;.}../*.** Ret
24cc0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
24cd0 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  f bytes of paylo
24ce0 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ad for the entry
24cf0 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
24d00 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
24d10 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62  ing to.  For tab
24d20 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73 20  le btrees, this 
24d30 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75  will be the amou
24d40 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20  nt.** of data.  
24d50 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65 73  For index btrees
24d60 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  , this will be t
24d70 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b  he size of the k
24d80 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
24d90 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
24da0 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
24db0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
24dc0 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
24dd0 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
24de0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
24df0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
24e00 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
24e10 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
24e20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
24e30 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
24e40 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73  _VALID..*/.u32 s
24e50 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
24e60 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  adSize(BtCursor 
24e70 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
24e80 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24e90 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24ea0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24eb0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24ec0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
24ed0 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
24ee0 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  n pCur->info.nPa
24ef0 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  yload;.}../*.** 
24f00 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
24f10 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
24f20 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
24f30 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
24f40 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
24f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
24f60 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
24f70 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
24f80 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
24f90 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
24fa0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
24fb0 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
24fc0 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
24fd0 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
24fe0 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
24ff0 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
25000 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
25010 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
25020 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
25030 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
25040 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
25050 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
25060 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
25070 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
25080 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
25090 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
250a0 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
250b0 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
250c0 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
250d0 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
250e0 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
250f0 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
25100 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
25110 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
25120 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
25130 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
25140 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
25150 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
25160 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
25170 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
25180 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
25190 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
251a0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
251b0 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
251c0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
251d0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
251e0 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
251f0 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
25200 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
25210 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
25220 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
25230 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
25240 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
25250 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
25260 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
25270 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
25280 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
25290 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
252a0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
252b0 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
252c0 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
252d0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
252e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
252f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25300 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25320 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
25330 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
25340 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
25350 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
25360 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
25370 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
25380 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
25390 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
253a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
253b0 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
253c0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
253d0 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
253e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
253f0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
25400 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
25410 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25420 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
25430 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
25440 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
25450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25460 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25470 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
25480 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
25490 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
254a0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
254b0 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
254c0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
254d0 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
254e0 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
254f0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
25500 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
25510 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
25520 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
25530 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
25540 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
25550 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
25560 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
25570 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
25580 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
25590 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
255a0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
255b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
255c0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
255d0 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
255e0 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
255f0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
25600 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
25610 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
25620 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
25630 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
25640 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
25650 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
25660 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
25670 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
25680 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
25690 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
256a0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
256b0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
256c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
256d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
256e0 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
256f0 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
25700 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
25710 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25720 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
25730 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25740 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
25750 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
25760 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
25770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25780 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
25790 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
257a0 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61  l, &pPage, (ppPa
257b0 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47  ge==0) ? PAGER_G
257c0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
257d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
257e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
257f0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
25800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25810 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
25820 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
25830 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
25840 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
25850 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
25860 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
25870 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
25880 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
25890 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
258a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
258b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
258c0 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
258d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
258e0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
258f0 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
25900 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
25910 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
25920 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
25930 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
25940 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
25950 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
25960 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
25970 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
25980 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
25990 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
259a0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
259b0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
259c0 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
259d0 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
259e0 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
259f0 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
25a00 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
25a10 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
25a20 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
25a30 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
25a40 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
25a50 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
25a60 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25a70 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
25a80 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
25a90 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
25aa0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
25ab0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
25ac0 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
25ad0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
25ae0 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
25af0 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
25b00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
25b10 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
25b20 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25b40 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
25b50 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
25b60 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
25b70 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
25b80 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
25b90 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
25ba0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
25bb0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
25bc0 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
25bd0 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
25be0 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
25bf0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
25c00 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
25c10 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
25c20 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
25c30 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
25c40 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
25c50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
25c60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25c70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25c80 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
25c90 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
25ca0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
25cb0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
25cc0 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
25cd0 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
25ce0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
25cf0 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
25d00 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
25d10 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
25d20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
25d30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25d40 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
25d50 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
25d60 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
25d70 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
25d80 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
25d90 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
25da0 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61  to. The eOp.** a
25db0 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72  rgument is inter
25dc0 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
25dd0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68  s:.**.**   0: Th
25de0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
25df0 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20   read. Populate 
25e00 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
25e10 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20  he..**   1: The 
25e20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77  operation is a w
25e30 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74  rite. Populate t
25e40 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
25e50 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
25e60 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
25e70 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
25e80 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
25e90 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
25ea0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
25eb0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
25ec0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
25ed0 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
25ee0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
25ef0 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
25f00 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
25f10 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
25f20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
25f30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
25f40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
25f50 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
25f60 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
25f70 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
25f80 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  s.** this functi
25f90 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
25fa0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
25fb0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a  zily populate.**
25fc0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
25fd0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
25fe0 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
25ff0 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
26000 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
26010 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
26020 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
26030 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
26040 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
26050 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
26060 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
26070 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
26080 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
26090 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a  ed, it must be.*
260a0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
260b0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
260c0 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
260d0 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
260e0 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
260f0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
26100 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
26110 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
26120 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
26130 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
26140 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
26150 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
26160 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
26170 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
26180 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
26190 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
261a0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
261b0 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
261c0 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
261d0 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
261e0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
261f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
26200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
26210 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
26220 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
26230 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
26240 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
26250 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
26260 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
26270 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
26280 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
26290 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
262a0 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
262b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
262c0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
262d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
262e0 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
262f0 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
26300 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
26310 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
26320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
26330 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
26340 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
26350 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
26360 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
26370 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26380 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
26390 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
263a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
263b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
263c0 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
263d0 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
263e0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
263f0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
26400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26410 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
26420 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
26430 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
26440 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
26450 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
26460 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
26470 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
26480 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  f;     /* Start 
26490 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20  of original out 
264a0 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66  buffer */.#endif
264b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
264c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  e );.  assert( e
264d0 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20  Op==0 || eOp==1 
264e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
264f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26500 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
26510 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50  ert( pCur->ix<pP
26520 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
26530 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26540 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26550 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
26560 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
26570 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
26580 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65  pPayload;.  asse
26590 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
265a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
265b0 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65  yload );..  asse
265c0 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70  rt( aPayload > p
265d0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
265e0 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61 79   if( (uptr)(aPay
265f0 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44  load - pPage->aD
26600 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61  ata) > (pBt->usa
26610 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e  bleSize - pCur->
26620 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a  info.nLocal) ){.
26630 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
26640 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
26650 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
26660 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
26670 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  ror.  The.    **
26680 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
26690 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20  ve is really:.  
266a0 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61    **    &aPayloa
266b0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
266c0 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
266d0 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
266e0 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74  Size].    ** but
266f0 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20   is recast into 
26700 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d  its current form
26710 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65   to avoid intege
26720 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c  r overflow probl
26730 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ems.    */.    r
26740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26750 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
26760 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f  >pgno);.  }..  /
26770 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
26780 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
26790 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
267a0 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
267b0 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
267c0 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
267d0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
267e0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
267f0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
26800 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
26810 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
26820 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
26830 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
26840 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
26850 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
26860 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
26870 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
26880 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
26890 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
268a0 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
268b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
268c0 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
268d0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a  o.nLocal;.  }...
268e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
268f0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
26900 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
26910 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
26920 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
26930 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
26940 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
26950 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
26960 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
26970 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
26980 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
26990 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20  o.nLocal]);..   
269a0 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72   /* If the BtCur
269b0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  sor.aOverflow[] 
269c0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
269d0 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
269e0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a   it now..    **.
269f0 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
26a00 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
26a10 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
26a20 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
26a30 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
26a40 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
26a50 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
26a60 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
26a70 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
26a80 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
26a90 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
26aa0 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
26ab0 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
26ac0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
26ad0 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
26ae0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
26af0 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
26b00 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
26b10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
26b20 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
26b30 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
26b40 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
26b50 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
26b60 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
26b70 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
26b80 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
26b90 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  ze;.      if( nO
26ba0 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41  vfl>pCur->nOvflA
26bb0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
26bc0 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
26bd0 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
26be0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
26bf0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
26c00 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
26c10 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
26c20 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
26c30 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
26c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26c50 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
26c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26c70 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
26c80 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
26c90 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
26ca0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
26cb0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
26cc0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
26cd0 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
26ce0 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
26cf0 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
26d00 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
26d10 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  |= BTCF_ValidOvf
26d20 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
26d30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
26d40 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
26d50 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
26d60 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
26d70 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79  e.      ** entry
26d80 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
26d90 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
26da0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
26db0 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69  skip.      ** di
26dc0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
26dd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
26de0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26df0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
26e00 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64  ] ){.        iId
26e10 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
26e20 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Size);.        n
26e30 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
26e40 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
26e50 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
26e60 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
26e70 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
26e80 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
26e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26ea0 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68   amt>0 );.    wh
26eb0 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b  ile( nextPage ){
26ec0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
26ed0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
26ee0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
26ef0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
26f00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26f10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26f20 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
26f30 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61        || pCur->a
26f40 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
26f50 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20  nextPage.       
26f60 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
26f70 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43  T_DB );.      pC
26f80 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26f90 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
26fa0 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
26fb0 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
26fc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
26fd0 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
26fe0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
26ff0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
27000 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
27010 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
27020 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
27030 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
27040 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27050 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
27060 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
27070 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
27080 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
27090 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
270a0 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
270b0 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
270c0 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
270d0 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
270e0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
270f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
27100 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
27110 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
27120 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
27130 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27140 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
27150 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
27160 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
27170 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
27180 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
27190 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
271a0 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
271b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
271c0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
271d0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
271e0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
271f0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
27200 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
27210 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
27220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27230 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
27240 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
27250 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
27260 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
27270 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
27280 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
27290 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
272a0 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
272b0 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
272c0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
272d0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
272e0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
272f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
27300 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72        /* File fr
27310 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64  om which to do d
27320 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72  irect overflow r
27330 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
27340 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
27350 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
27360 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
27370 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
27380 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
27390 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
273a0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
273b0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
273c0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
273d0 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
273e0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
273f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27400 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
27410 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
27420 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
27430 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
27440 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
27450 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
27460 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
27470 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
27480 20 20 20 33 29 20 74 68 65 72 65 20 69 73 20 6e     3) there is n
27490 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61  o open write-tra
274a0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
274b0 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
274c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
274d0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
274e0 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
274f0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
27500 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20  n the WAL file. 
27510 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
27520 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
27530 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
27540 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  n read into the 
27550 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20  output buffer . 
27560 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27570 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
27580 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
27590 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
275a0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
275b0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
275c0 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
275d0 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
275e0 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
275f0 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
27600 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
27610 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
27620 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
27630 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
27640 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27650 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
27690 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
276a0 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276d0 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
276e0 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
276f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
27700 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27720 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
27730 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
27740 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
27750 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
27760 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f  ds     /* (4) */
27770 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
27780 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57  sqlite3PagerUseW
27790 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
277a0 6e 65 78 74 50 61 67 65 29 20 20 20 20 20 20 20  nextPage)       
277b0 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
277c0 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
277d0 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277f0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
27800 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
27810 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
27820 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
27830 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
27840 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
27850 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
27860 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
27870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27880 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20        /* due to 
27890 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
278a0 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
278b0 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
278c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
278d0 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
278e0 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
278f0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
27900 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
27910 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
27920 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
27930 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
27940 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
27950 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
27960 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
27970 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
27980 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
27990 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
279a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
279b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
279c0 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
279d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
279e0 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  eOp==0 ? PAGER_G
279f0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
27a00 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
27a10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27a30 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
27a40 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
27a50 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
27a60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
27a70 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
27a80 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
27a90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
27aa0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
27ab0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
27ac0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
27ad0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
27ae0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
27af0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
27b00 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
27b10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
27b20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27b30 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
27b40 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d         if( amt==
27b50 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
27b60 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
27b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27b80 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
27b90 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20        iIdx++;.  
27ba0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
27bb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27bc0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  amt>0 ){.    /* 
27bd0 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65  Overflow chain e
27be0 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20  nds prematurely 
27bf0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
27c00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
27c10 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
27c20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
27c40 61 72 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f  art of the paylo
27c50 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61  ad for the row a
27c60 74 20 77 68 69 63 68 20 74 68 61 74 20 63 75 72  t which that cur
27c70 73 6f 72 20 70 43 75 72 20 69 73 20 63 75 72 72  sor pCur is curr
27c80 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
27c90 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65 73 20  g.  "amt" bytes 
27ca0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
27cb0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
27cc0 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
27cd0 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
27ce0 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  set"..**.** pCur
27cf0 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67   can be pointing
27d00 20 74 6f 20 65 69 74 68 65 72 20 61 20 74 61 62   to either a tab
27d10 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62  le or an index b
27d20 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69  -tree..** If poi
27d30 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
27d40 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65   btree, then the
27d50 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e   content section
27d60 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a   is read.  If.**
27d70 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
27d80 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d  g to an index b-
27d90 74 72 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65  tree then the ke
27da0 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61  y section is rea
27db0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c  d..**.** For sql
27dc0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
27dd0 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  (), the caller m
27de0 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
27df0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
27e00 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72  .** to a valid r
27e10 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ow in the table.
27e20 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72    For sqlite3Btr
27e30 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  eePayloadChecked
27e40 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  (), the.** curso
27e50 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c  r might be inval
27e60 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64  id or might need
27e70 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20   to be restored 
27e80 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61  before being rea
27e90 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
27ea0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
27eb0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
27ec0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
27ed0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
27ee0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
27ef0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
27f00 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
27f10 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
27f20 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
27f30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27f40 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72  reePayload(BtCur
27f50 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
27f60 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
27f70 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
27f80 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
27f90 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
27fa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27fb0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27fc0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
27fd0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
27fe0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
27ff0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
28000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28010 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67  ->ix<pCur->apPag
28020 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28030 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
28040 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
28050 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
28060 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
28070 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
28080 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
28090 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  nt of sqlite3Btr
280a0 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b  eePayload() work
280b0 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75  s even if the cu
280c0 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  rsor has not.** 
280d0 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41  in the CURSOR_VA
280e0 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69  LID state.  It i
280f0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74  s only used by t
28100 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  he sqlite3_blob_
28110 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66  read().** interf
28120 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ace..*/.#ifndef 
28130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
28140 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49  BLOB.static SQLI
28150 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
28160 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65  accessPayloadChe
28170 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
28180 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66   *pCur,.  u32 of
28190 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c  fset,.  u32 amt,
281a0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b  .  void *pBuf.){
281b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20  .  int rc;.  if 
281c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
281d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
281e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
281f0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20  ITE_ABORT;.  }. 
28200 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
28210 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
28220 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
28230 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
28240 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
28250 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a  return rc ? rc :
28260 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
28270 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
28280 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e  , pBuf, 0);.}.in
28290 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
282a0 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43  yloadChecked(BtC
282b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
282c0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
282d0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
282e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
282f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28300 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  ){.    assert( c
28310 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28320 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72  d(pCur) );.    r
28330 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
28340 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
28350 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
28360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
28370 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
28380 61 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20  adChecked(pCur, 
28390 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
283a0 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
283b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
283c0 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
283d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
283e0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
283f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
28400 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
28410 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
28420 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
28430 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
28440 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
28450 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
28460 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
28470 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
28480 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
28490 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
284a0 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
284b0 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
284c0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
284d0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
284e0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
284f0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
28500 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
28510 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
28520 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
28530 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
28540 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
28550 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
28560 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
28570 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
28580 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
28590 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
285a0 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
285b0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
285c0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
285d0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
285e0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
285f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
28600 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
28610 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
28620 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
28630 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
28640 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
28650 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
28660 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
28670 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
28680 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
28690 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
286a0 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
286b0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
286c0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
286d0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
286e0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
286f0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
28700 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
28710 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
28720 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
28730 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
28740 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
28750 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
28760 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
28770 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
28780 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
28790 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
287a0 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
287b0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
287c0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
287d0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
287e0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
287f0 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
28800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
28810 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
28820 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
28830 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  s here */.){.  u
28840 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74  32 amt;.  assert
28850 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
28860 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
28870 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28880 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
28890 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
288a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
288b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
288c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
288d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
288e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
288f0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
28900 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
28910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28920 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67  ->ix<pCur->apPag
28930 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28940 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
28950 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
28960 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ize>0 );.  asser
28970 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
28980 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50  ayload>pCur->apP
28990 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
289a0 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55  ->aData || CORRU
289b0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
289c0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
289d0 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50  ayload<pCur->apP
289e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
289f0 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
28a00 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
28a10 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70  = (int)(pCur->ap
28a20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28a30 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  ]->aDataEnd - pC
28a40 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
28a50 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  d);.  if( pCur->
28a60 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20  info.nLocal<amt 
28a70 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e  ) amt = pCur->in
28a80 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41  fo.nLocal;.  *pA
28a90 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75  mt = amt;.  retu
28aa0 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
28ab0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
28ac0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
28ad0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
28ae0 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
28af0 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
28b00 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
28b10 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
28b20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
28b30 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
28b40 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
28b50 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
28b60 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
28b70 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
28b80 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
28b90 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
28ba0 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
28bb0 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
28bc0 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
28bd0 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
28be0 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
28bf0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
28c00 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
28c10 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
28c20 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
28c30 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
28c40 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
28c50 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
28c60 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
28c70 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
28c80 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
28c90 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
28ca0 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
28cb0 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
28cc0 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
28cd0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
28ce0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
28cf0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
28d00 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
28d10 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
28d20 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72  yloadFetch(BtCur
28d30 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
28d40 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
28d50 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
28d60 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
28d70 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
28d80 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
28d90 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
28da0 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
28db0 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
28dc0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
28dd0 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
28de0 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
28df0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
28e00 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
28e10 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
28e20 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
28e30 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
28e40 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
28e50 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
28e60 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
28e70 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
28e80 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
28e90 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
28ea0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
28eb0 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
28ec0 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
28ed0 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
28ee0 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
28ef0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28f00 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42  32 newPgno){.  B
28f10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
28f20 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
28f30 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
28f40 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
28f50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28f60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28f70 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
28f80 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
28f90 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
28fa0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
28fb0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b  Cur->iPage>=0 );
28fc0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
28fd0 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
28fe0 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
28ff0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29000 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29010 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  }.  pCur->info.n
29020 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
29030 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
29040 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29050 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29060 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29070 75 72 2d 3e 69 50 61 67 65 2b 2b 5d 20 3d 20 70  ur->iPage++] = p
29080 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d  Cur->ix;.  pCur-
29090 3e 69 78 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  >ix = 0;.  retur
290a0 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  n getAndInitPage
290b0 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
290c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
290d0 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20  r->iPage],.     
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63     pCur, pCur->c
29100 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
29110 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
29120 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
29130 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
29140 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
29150 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
29160 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
29170 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
29180 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
29190 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
291a0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
291b0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
291c0 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
291d0 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
291e0 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
291f0 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
29200 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
29210 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
29220 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
29230 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
29240 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
29250 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
29260 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
29270 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
29280 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
29290 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
292a0 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
292b0 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
292c0 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
292d0 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
29300 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
29310 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
29320 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
29330 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
29340 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
29350 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
29360 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
29370 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
29380 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
29390 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
293a0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
293b0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
293c0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
293d0 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
293e0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
293f0 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
29400 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
29410 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
29420 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
29430 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
29440 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
29450 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
29460 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
29470 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
29480 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
29490 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
294a0 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
294b0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
294c0 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
294d0 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
294e0 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
294f0 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
29500 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
29510 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
29520 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
29530 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
29540 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
29550 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29560 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29580 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29590 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
295a0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
295b0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
295c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
295d0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
295e0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
295f0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
29600 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
29610 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
29620 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
29630 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
29640 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29650 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
29660 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
29670 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29680 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
29690 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
296a0 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
296b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
296c0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
296d0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
296e0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
296f0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
29700 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69  r->ix = pCur->ai
29710 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
29720 31 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  1];.  releasePag
29730 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
29740 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29750 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e--]);.}../*.** 
29760 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29770 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
29780 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
29790 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
297a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
297b0 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
297c0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
297d0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
297e0 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
297f0 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
29800 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
29810 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
29820 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
29830 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
29840 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
29850 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
29860 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
29870 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
29880 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
29890 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
298a0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
298b0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
298c0 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
298d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
298e0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
298f0 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
29900 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
29910 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
29920 56 41 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72  VALID and this r
29930 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
29940 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68  QLITE_EMPTY. Oth
29950 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63  erwise,.** the c
29960 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
29970 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
29980 73 74 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  st cell located 
29990 6f 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28  on the root.** (
299a0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
299b0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
299c0 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
299d0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
299e0 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
299f0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
29a00 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
29a10 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
29a20 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
29a30 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
29a40 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
29a50 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
29a60 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
29a70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
29a80 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
29a90 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
29aa0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
29ab0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
29ac0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
29ad0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
29ae0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
29af0 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
29b00 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
29b10 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
29b20 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
29b30 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
29b40 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
29b50 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
29b60 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
29b70 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
29b80 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
29b90 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
29ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29bb0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
29bc0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
29bd0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
29be0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29bf0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
29c00 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
29c10 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
29c20 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
29c30 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
29c40 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
29c50 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
29c60 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
29c70 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
29c80 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
29c90 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
29ca0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
29cb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29cc0 74 61 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45  tate < CURSOR_RE
29cd0 51 55 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75  QUIRESEEK || pCu
29ce0 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20  r->iPage<0 );.  
29cf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
29d00 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72  noRoot>0 || pCur
29d10 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20  ->iPage<0 );..  
29d20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
29d30 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  =0 ){.    if( pC
29d40 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
29d50 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61     do{.        a
29d60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
29d70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29d80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
29d90 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
29da0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
29db0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
29dc0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43        }while( pC
29dd0 75 72 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20  ur->iPage);.    
29de0 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74    goto skip_init
29df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
29e00 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
29e10 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
29e20 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29e30 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
29e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d  return SQLITE_EM
29e50 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  PTY;.  }else{.  
29e60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29e70 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
29e80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
29e90 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
29ea0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20  IRESEEK ){.     
29eb0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29ec0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
29ed0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
29ee0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
29ef0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
29f00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
29f10 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
29f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
29f30 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
29f40 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
29f50 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
29f60 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
29f70 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
29f80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
29f90 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fb0 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
29fc0 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
29fd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
29ff0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2a000 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2a010 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a020 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
2a030 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
2a040 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
2a050 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
2a060 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
2a070 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
2a080 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
2a090 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
2a0a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
2a0b0 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e  ..  /* If pCur->
2a0c0 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
2a0d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
2a0e0 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
2a0f0 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
2a100 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
2a110 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
2a120 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
2a130 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
2a140 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20  o is.  ** NULL, 
2a150 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
2a160 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
2a170 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
2a180 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a  t the case,.  **
2a190 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
2a1a0 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
2a1b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c   .  **.  ** Earl
2a1c0 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
2a1d0 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74  SQLite assumed t
2a1e0 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f  hat this test co
2a1f0 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a  uld not fail.  *
2a200 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * if the root pa
2a210 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c  ge was already l
2a220 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20  oaded when this 
2a230 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2a240 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  led (i.e..  ** i
2a250 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  f pCur->iPage>=0
2a260 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e  ). But this is n
2a270 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74  ot so if the dat
2a280 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
2a290 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68  ed .  ** in such
2a2a0 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65   a way that page
2a2b0 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64   pRoot is linked
2a2c0 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62   into a second b
2a2d0 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a  -tree table .  *
2a2e0 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69  * (or the freeli
2a2f0 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  st).  */.  asser
2a300 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  t( pRoot->intKey
2a310 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e  ==1 || pRoot->in
2a320 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tKey==0 );.  if(
2a330 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d   pRoot->isInit==
2a340 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79  0 || (pCur->pKey
2a350 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d  Info==0)!=pRoot-
2a360 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
2a370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2a380 52 55 50 54 5f 50 47 4e 4f 28 70 43 75 72 2d 3e  RUPT_PGNO(pCur->
2a390 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a3a0 67 65 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ge]->pgno);.  }.
2a3b0 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20  .skip_init:  .  
2a3c0 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
2a3d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a3e0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2a3f0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2a400 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2a410 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2a420 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74  dOvfl);..  pRoot
2a430 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2a440 30 5d 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0];.  if( pRoot-
2a450 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2a460 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2a470 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
2a480 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
2a490 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
2a4a0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
2a4b0 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
2a4c0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
2a4d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a4e0 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
2a4f0 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
2a500 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
2a510 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2a520 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2a530 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2a540 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2a550 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
2a560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2a570 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2a580 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2a590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
2a5a0 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  TY;.  }.  return
2a5b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2a5c0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2a5d0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
2a5e0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2a5f0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
2a600 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
2a610 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2a620 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
2a630 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
2a640 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2a650 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
2a660 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
2a670 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2a680 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2a690 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
2a6a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a6b0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2a6c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a6d0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2a6e0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2a6f0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a700 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a710 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a720 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a730 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
2a740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a750 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2a760 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a770 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
2a780 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a790 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ix<pPage->nCell 
2a7a0 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
2a7b0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2a7c0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29  pPage, pCur->ix)
2a7d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
2a7e0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2a7f0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
2a800 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2a810 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2a820 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
2a830 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2a840 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2a850 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
2a860 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2a870 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
2a880 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
2a890 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
2a8a0 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
2a8b0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2a8c0 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
2a8d0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
2a8e0 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
2a8f0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
2a900 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
2a910 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
2a920 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
2a930 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2a940 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
2a950 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
2a960 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
2a970 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2a980 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
2a990 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
2a9a0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
2a9b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a9c0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2a9d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2a9e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
2a9f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2aa00 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
2aa10 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
2aa20 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2aa30 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2aa40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2aa50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2aa60 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
2aa70 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
2aa80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2aa90 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
2aaa0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2aab0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2aac0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2aad0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2aae0 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2aaf0 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
2ab00 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2ab10 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
2ab20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ab30 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20   }.  pCur->ix = 
2ab40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2ab50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ab60 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2ab70 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2ab80 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2ab90 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
2aba0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2abb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
2abc0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2abd0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2abe0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2abf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2ac00 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2ac10 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2ac20 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2ac30 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2ac40 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2ac50 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2ac60 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2ac70 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2ac80 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
2ac90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2aca0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2acb0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2acc0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2acd0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ace0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2acf0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2ad00 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2ad10 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
2ad20 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2ad30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ad40 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2ad50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2ad60 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2ad70 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  l>0 );.    *pRes
2ad80 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
2ad90 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2ada0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ur);.  }else if(
2adb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2adc0 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
2add0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2ade0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2adf0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2ae00 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2ae10 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2ae20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ae30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ae40 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2ae50 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
2ae60 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2ae70 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2ae80 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2ae90 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2aea0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2aeb0 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2aec0 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2aed0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2aee0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2aef0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2af00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2af10 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2af20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2af30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2af40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2af50 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2af60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2af70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2af80 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2af90 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2afa0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2afb0 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2afc0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2afd0 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2afe0 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2aff0 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2b000 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2b010 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2b020 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2b030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2b040 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2b050 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2b060 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2b070 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2b080 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2b090 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2b0a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2b0b0 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2b0c0 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2b0d0 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2b0e0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2b0f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2b100 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2b110 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2b120 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2b130 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70  ert( pCur->ix==p
2b140 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b150 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2b160 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2b170 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b180 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2b190 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2b1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b1b0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2b1c0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2b1d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b1e0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2b1f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b200 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b210 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2b220 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2b230 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2b240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
2b260 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2b270 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2b280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
2b290 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2b2a0 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20  ~BTCF_AtLast;.  
2b2b0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2b2c0 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59  rc==SQLITE_EMPTY
2b2d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2b2e0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2b2f0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2b300 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2b310 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2b320 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
2b330 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b340 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b350 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2b360 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
2b370 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
2b380 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
2b390 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
2b3a0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
2b3b0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
2b3c0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
2b3d0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
2b3e0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
2b3f0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
2b400 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
2b410 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
2b420 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2b430 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
2b440 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
2b450 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
2b460 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
2b470 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
2b480 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
2b490 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
2b4a0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2b4b0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
2b4c0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
2b4d0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
2b4e0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
2b4f0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
2b500 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
2b510 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
2b520 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
2b530 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
2b540 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
2b550 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
2b560 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
2b570 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
2b580 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
2b590 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
2b5a0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
2b5b0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
2b5c0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
2b5d0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
2b5e0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
2b5f0 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
2b600 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
2b610 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
2b620 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2b630 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2b640 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2b650 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
2b660 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
2b670 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
2b680 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2b690 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
2b6a0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
2b6b0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
2b6c0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
2b6d0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
2b6e0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
2b6f0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2b700 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2b710 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b730 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2b740 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2b750 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2b760 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
2b770 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2b780 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2b790 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2b7a0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
2b7b0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2b7c0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f  IdxKey..**.** Fo
2b7d0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2b7e0 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53  the pIdxKey->eqS
2b7f0 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74  een field is set
2b800 20 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a   to 1 if there.*
2b810 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72  * exists an entr
2b820 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  y in the table t
2b830 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63  hat exactly matc
2b840 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a  hes pIdxKey.  .*
2b850 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2b860 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
2b870 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2b880 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
2b890 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
2b8a0 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
2b8b0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
2b8c0 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
2b8d0 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
2b8e0 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
2b8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b900 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
2b910 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
2b920 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
2b930 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
2b940 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
2b950 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
2b960 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
2b970 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
2b980 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
2b990 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2b9a0 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78   RecordCompare x
2b9b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a  RecordCompare;..
2b9c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b9d0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2b9e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b9f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2ba00 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2ba10 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2ba20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
2ba30 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
2ba40 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
2ba50 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
2ba60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ba70 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ba80 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79  ALID || (pIdxKey
2ba90 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72  ==0)==(pCur->cur
2baa0 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20  IntKey!=0) );.. 
2bab0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2bac0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
2bad0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
2bae0 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
2baf0 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
2bb00 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
2bb10 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
2bb20 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
2bb30 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a   if( pIdxKey==0.
2bb40 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
2bb50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2bb60 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2bb70 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2bb80 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20  NKey)!=0.  ){.  
2bb90 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2bba0 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
2bbb0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2bbc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2bbd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2bbe0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2bbf0 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
2bc00 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75  {.      if( (pCu
2bc10 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2bc20 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2bc30 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2bc40 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74   -1;.        ret
2bc50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2bc60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
2bc70 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
2bc80 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65   key is one more
2bc90 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f   than the previo
2bca0 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20  us key, then.   
2bcb0 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74     ** try to get
2bcc0 20 74 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c   there using sql
2bcd0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2bce0 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 66 75  rather than a fu
2bcf0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61  ll.      ** bina
2bd00 72 79 20 73 65 61 72 63 68 2e 20 20 54 68 69 73  ry search.  This
2bd10 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2bd20 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63  ion only.  The c
2bd30 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20  orrect answer.  
2bd40 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2bd50 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74  obtained without
2bd60 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79   this case, only
2bd70 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73   a little more s
2bd80 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20  lowely */.      
2bd90 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2bda0 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26  Key+1==intKey &&
2bdb0 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74   !pCur->skipNext
2bdc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
2bdd0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
2bde0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2bdf0 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20  Next(pCur, 0);. 
2be00 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2be10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2be20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
2be30 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20  o(pCur);.       
2be40 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2be50 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
2be60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2be70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2be80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2be90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2bea0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2beb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2bed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bee0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2bef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2bf00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2bf10 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
2bf20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2bf30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
2bf40 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
2bf50 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
2bf60 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  errCode = 0;.   
2bf70 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
2bf80 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
2bf90 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2bfa0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2bfb0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
2bfc0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2bfd0 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
2bfe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
2bff0 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
2c000 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
2c010 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
2c020 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
2c030 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2c040 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
2c050 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  c==SQLITE_EMPTY 
2c060 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2c070 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2c080 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2c090 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c0a0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2c0b0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2c0c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c0d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2c0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c0f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c100 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c110 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
2c120 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2c130 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
2c140 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2c150 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c160 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2c170 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2c180 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2c190 5d 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a  ]->nCell > 0 );.
2c1a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c1b0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
2c1c0 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y==pCur->curIntK
2c1d0 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2c1e0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2c1f0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
2c200 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
2c210 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
2c220 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
2c230 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
2c240 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
2c250 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2c260 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
2c270 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2c280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2c290 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2c2a0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2c2b0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2c2c0 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2c2d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2c2e0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2c2f0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2c300 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2c310 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2c320 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2c330 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2c340 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2c350 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2c360 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2c370 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2c380 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2c390 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2c3a0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2c3b0 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2c3c0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2c3d0 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2c3e0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2c3f0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2c400 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2c410 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2c420 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2c430 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2c440 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2c450 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2c460 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2c470 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2c480 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2c490 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2c4a0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2c4b0 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2c4c0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2c4d0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2c4e0 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2c4f0 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2c500 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2c510 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2c520 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2c530 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2c540 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2c550 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2c560 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2c570 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2c580 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2c590 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2c5a0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2c5b0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2c5c0 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2c5d0 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2c5e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2c5f0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2c600 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2c610 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2c620 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c630 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2c640 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ataEnd ){.      
2c650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2c660 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
2c670 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
2c680 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c690 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c6a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2c6b0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2c6c0 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2c6d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2c6e0 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2c6f0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2c700 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2c710 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2c720 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2c730 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c740 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2c750 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2c760 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2c770 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2c780 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2c790 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2c7a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2c7b0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2c7c0 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2c7d0 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2c7e0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2c7f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2c800 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2c810 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2c820 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c830 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2c840 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2c850 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2c860 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2c870 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
2c880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2c890 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2c8a0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2c8b0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2c8c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2c8d0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2c8e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2c8f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c900 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2c920 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2c930 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2c940 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2c950 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2c960 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2c970 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2c980 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2c990 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2c9a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2c9b0 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2c9c0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2c9d0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2c9e0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2c9f0 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2ca00 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2ca10 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2ca20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2ca30 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2ca40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
2ca50 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2ca60 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
2ca70 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
2ca80 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
2ca90 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
2caa0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
2cab0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
2cac0 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
2cad0 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
2cae0 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
2caf0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
2cb00 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
2cb10 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
2cb20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
2cb30 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
2cb40 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
2cb50 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
2cb60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
2cb70 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
2cb80 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
2cb90 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
2cba0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
2cbb0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
2cbc0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
2cbd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2cbe0 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
2cbf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2cc00 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
2cc10 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
2cc20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
2cc30 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
2cc40 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
2cc50 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
2cc60 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
2cc70 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
2cc80 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2cc90 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
2cca0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
2ccb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
2ccc0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2ccd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2cce0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
2ccf0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2cd00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2cd10 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2cd20 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2cd30 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
2cd40 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2cd50 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
2cd60 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
2cd70 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
2cd80 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
2cd90 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
2cda0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
2cdb0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2cdc0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2cdd0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
2cde0 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
2cdf0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
2ce00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
2ce10 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2ce20 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
2ce30 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2ce40 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2ce50 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
2ce60 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2ce70 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2ce80 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2ce90 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2cea0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
2ceb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cec0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2ced0 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
2cee0 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
2cef0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2cf00 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
2cf10 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
2cf20 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
2cf30 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
2cf40 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
2cf50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
2cf60 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
2cf70 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
2cf80 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
2cf90 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
2cfa0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
2cfb0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
2cfc0 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
2cfd0 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
2cfe0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2cff0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
2d000 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
2d010 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
2d020 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
2d030 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
2d040 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
2d050 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2d060 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
2d070 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
2d080 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
2d090 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
2d0a0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2d0b0 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
2d0c0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
2d0d0 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
2d0e0 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
2d0f0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
2d100 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
2d110 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
2d120 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
2d130 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
2d140 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
2d150 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2d160 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
2d170 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
2d180 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
2d190 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
2d1a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2d1b0 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
2d1c0 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
2d1d0 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
2d1e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
2d1f0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2d200 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
2d210 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2d220 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
2d230 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d240 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
2d250 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2d260 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2d270 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
2d280 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2d290 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
2d2a0 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
2d2b0 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
2d2c0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
2d2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d2e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2d2f0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
2d300 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
2d310 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2d320 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2d330 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
2d340 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
2d350 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
2d360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d370 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
2d380 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2d390 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2d3a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2d3b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2d3c0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2d3d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d3e0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2d3f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
2d400 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2d410 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
2d420 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
2d430 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
2d440 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2d450 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
2d460 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20  dOvfl;.         
2d470 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2d480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d490 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2d4a0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2d4b0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2d4c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d4d0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2d4e0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2d4f0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2d500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2d510 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2d520 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2d530 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2d540 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2d550 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2d560 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2d570 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2d580 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2d590 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2d5a0 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2d5b0 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2d5c0 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2d5d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2d5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2d5f0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2d600 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2d610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2d620 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2d630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d640 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2d650 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2d660 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2d670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d680 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2d690 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2d6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d6b0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2d6c0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2d6d0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2d6e0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2d6f0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2d700 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2d710 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2d720 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2d730 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2d740 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2d750 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2d760 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2d770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d780 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2d790 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2d7a0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2d7b0 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2d7c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2d7d0 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2d7e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2d7f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2d800 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61  r->ix<pCur->apPa
2d810 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2d820 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
2d830 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2d840 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
2d850 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
2d860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d870 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2d880 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
2d890 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
2d8a0 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
2d8b0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2d8c0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2d8d0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2d8e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2d8f0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2d900 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
2d910 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2d920 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
2d930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2d940 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b  ->ix = (u16)lwr;
2d950 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2d960 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
2d970 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
2d980 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
2d990 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
2d9a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d9b0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
2d9c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2d9d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
2d9e0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
2d9f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
2da00 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2da10 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
2da20 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2da30 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
2da40 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
2da50 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
2da60 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
2da70 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2da80 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
2da90 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2daa0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
2dab0 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
2dac0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
2dad0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
2dae0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
2daf0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
2db00 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2db10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2db20 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
2db30 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
2db40 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
2db50 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
2db60 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
2db70 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
2db80 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
2db90 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
2dba0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
2dbb0 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
2dbc0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
2dbd0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
2dbe0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
2dbf0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
2dc00 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
2dc10 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
2dc20 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
2dc30 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65  turn an estimate
2dc40 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20   for the number 
2dc50 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2dc60 61 62 6c 65 20 74 68 61 74 20 70 43 75 72 20 69  able that pCur i
2dc70 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  s.** pointing to
2dc80 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
2dc90 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e  tive number if n
2dca0 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 75  o estimate is cu
2dcb0 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69  rrently .** avai
2dcc0 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71  lable..*/.i64 sq
2dcd0 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75  lite3BtreeRowCou
2dce0 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a  ntEst(BtCursor *
2dcf0 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  pCur){.  i64 n;.
2dd00 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72    u8 i;..  asser
2dd10 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2dd20 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2dd30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2dd40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2dd50 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2dd60 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75  tex) );..  /* Cu
2dd70 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74  rrently this int
2dd80 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63  erface is only c
2dd90 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f  alled by the OP_
2dda0 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f  IfSmaller.  ** o
2ddb0 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68  pcode, and it th
2ddc0 61 74 20 63 61 73 65 20 74 68 65 20 63 75 72 73  at case the curs
2ddd0 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  or will always b
2dde0 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a  e valid and.  **
2ddf0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69   will always poi
2de00 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64  nt to a leaf nod
2de10 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
2de20 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  R(pCur->eState!=
2de30 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20  CURSOR_VALID) ) 
2de40 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28  return -1;.  if(
2de50 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 70 50   NEVER(pCur->apP
2de60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2de70 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74  ->leaf==0) ) ret
2de80 75 72 6e 20 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e  urn -1;..  for(n
2de90 3d 31 2c 20 69 3d 30 3b 20 69 3c 3d 70 43 75 72  =1, i=0; i<=pCur
2dea0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
2deb0 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70     n *= pCur->ap
2dec0 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a  Page[i]->nCell;.
2ded0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
2dee0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
2def0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2df00 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
2df10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a   the database. .
2df20 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a  ** Return value:
2df30 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  .**.**    SQLITE
2df40 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65  _OK        succe
2df50 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ss.**    SQLITE_
2df60 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72  DONE      cursor
2df70 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
2df80 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74  ting at the last
2df90 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f   element.**    o
2dfa0 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20  therwise        
2dfb0 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
2dfc0 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
2dfd0 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2dfe0 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2dff0 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54  3BtreeNext().  T
2e000 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2e010 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2e020 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2e030 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d  of merely increm
2e040 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2e050 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2e060 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2e070 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68   next cell on th
2e080 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2e090 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2e0a0 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72  reeNext() helper
2e0b0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2e0c0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2e0d0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2e0e0 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2e0f0 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20  t page or.** to 
2e100 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2e110 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74  or..**.** If bit
2e120 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61   0x01 of the F a
2e130 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  rgument in sqlit
2e140 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29  e3BtreeNext(C,F)
2e150 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a   is 1, then the.
2e160 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  ** cursor corres
2e170 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2e180 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
2e190 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2e1a0 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
2e1b0 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
2e1c0 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
2e1d0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
2e1e0 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69   F argument.** i
2e1f0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2e200 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69  implement.  SQLi
2e210 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2e220 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2e230 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e   use.** this hin
2e240 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f  t, but COMDB2 do
2e250 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  es..*/.static SQ
2e260 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2e270 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75  t btreeNext(BtCu
2e280 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2e290 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
2e2a0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2e2b0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2e2c0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2e2d0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2e2e0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2e2f0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2e300 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e310 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
2e320 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2e330 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2e340 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2e350 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2e360 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2e370 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2e380 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2e390 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2e3a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e3b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e3c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2e3d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2e3e0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2e3f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e400 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
2e410 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2e420 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2e430 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2e440 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2e450 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2e460 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2e470 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2e480 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2e490 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2e4a0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e4b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
2e4c0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2e4d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e4e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e4f0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2e500 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2e510 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2e520 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2e530 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e540 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78  idx = ++pCur->ix
2e550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2e560 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2e570 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2e580 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
2e590 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
2e5a0 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
2e5b0 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
2e5c0 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
2e5d0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2e5e0 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
2e5f0 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
2e600 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
2e610 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
2e620 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
2e630 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
2e640 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
2e650 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2e660 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2e670 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
2e680 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
2e690 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
2e6a0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2e6b0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2e6c0 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
2e6d0 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
2e6e0 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
2e6f0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2e700 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2e710 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2e720 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2e730 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
2e740 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2e750 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2e760 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
2e770 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e780 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2e790 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2e7a0 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
2e7b0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2e7c0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2e7d0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2e7e0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2e7f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e800 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2e810 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2e820 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2e830 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2e840 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e850 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2e860 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70  ile( pCur->ix>=p
2e870 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2e880 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2e890 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2e8a0 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2e8b0 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a  eNext(pCur, 0);.
2e8c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e8d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e8e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2e8f0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2e900 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2e910 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2e920 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2e930 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2e940 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2e950 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2e960 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e970 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61   flags){.  MemPa
2e980 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e 55  ge *pPage;.  UNU
2e990 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66  SED_PARAMETER( f
2e9a0 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64  lags );  /* Used
2e9b0 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e   in COMDB2 but n
2e9c0 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65  ot native SQLite
2e9d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 75   */.  assert( cu
2e9e0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2e9f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ea00 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
2ea10 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73  flags==1 );.  as
2ea20 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2ea30 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2ea40 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2ea50 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
2ea60 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2ea70 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2ea80 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2ea90 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2eaa0 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75  Ovfl);.  if( pCu
2eab0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2eac0 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2ead0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29   btreeNext(pCur)
2eae0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2eaf0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2eb00 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b  Page];.  if( (++
2eb10 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65  pCur->ix)>=pPage
2eb20 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2eb30 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72  Cur->ix--;.    r
2eb40 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2eb50 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pCur);.  }.  if(
2eb60 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2eb70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2eb80 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2eb90 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2eba0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2ebb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
2ebc0 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
2ebd0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
2ebe0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
2ebf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
2ec00 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73  ** Return values
2ec10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
2ec20 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73  TE_OK     succes
2ec30 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
2ec40 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72 73 6f  DONE   the curso
2ec50 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20  r is already on 
2ec60 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
2ec70 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a  t of the table.*
2ec80 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  *     otherwise 
2ec90 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
2eca0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
2ecb0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2ecc0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2ecd0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2ece0 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
2ecf0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2ed00 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2ed10 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2ed20 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
2ed30 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2ed40 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2ed50 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
2ed60 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
2ed70 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2ed80 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
2ed90 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
2eda0 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
2edb0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2edc0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2edd0 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2ede0 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
2edf0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2ee00 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74  or..**.** If bit
2ee10 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61   0x01 of the F a
2ee20 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
2ee30 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2ee40 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 0a  C,F) is 1, then.
2ee50 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  ** the cursor co
2ee60 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2ee70 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
2ee80 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
2ee90 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b   have been.** sk
2eea0 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c  ipped if the SQL
2eeb0 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20   index had been 
2eec0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2eed0 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   The F argument 
2eee0 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20  is a.** hint to 
2eef0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20  the implement.  
2ef00 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74  The native SQLit
2ef10 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2ef20 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a  tation does not.
2ef30 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  ** use this hint
2ef40 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
2ef50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
2ef60 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2ef70 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2ef80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2ef90 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
2efa0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2efb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2efc0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2efd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2efe0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2eff0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2f000 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2f010 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2f020 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2f030 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2f040 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2f050 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
2f060 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2f070 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2f080 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f090 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f0a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
2f0b0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2f0c0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2f0d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f0e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f0f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2f100 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2f110 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2f120 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2f130 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
2f140 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2f150 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2f160 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f170 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2f180 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2f190 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2f1a0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2f1b0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2f1c0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2f1d0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2f1e0 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Next<0 ){.      
2f1f0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2f200 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2f210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2f230 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2f240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2f250 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2f260 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2f270 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f280 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2f290 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2f2a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
2f2b0 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72   pCur->ix;.    r
2f2c0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2f2d0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
2f2e0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2f2f0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
2f300 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f310 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
2f320 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
2f330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
2f340 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29  e( pCur->ix==0 )
2f350 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2f360 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2f370 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2f380 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2f390 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
2f3a0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
2f3b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2f3c0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2f3d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2f3e0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2f3f0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
2f400 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2f410 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
2f420 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
2f430 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ;..    pCur->ix-
2f440 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
2f450 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2f460 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
2f470 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2f480 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
2f490 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2f4a0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2f4b0 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  us(pCur, 0);.   
2f4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2f4d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f4e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2f4f0 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
2f500 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2f510 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2f520 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
2f530 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2f540 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2f550 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
2f560 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
2f570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2f580 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2f590 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2f5a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2f5b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2f5c0 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
2f5d0 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
2f5e0 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
2f5f0 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72  SQLite */.  pCur
2f600 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2f610 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2f620 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2f630 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
2f640 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2f650 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2f660 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f670 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
2f680 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  >ix==0.   || pCu
2f690 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2f6a0 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
2f6b0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2f6c0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
2f6d0 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ur);.  }.  pCur-
2f6e0 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  >ix--;.  return 
2f6f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2f700 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
2f710 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
2f720 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2f730 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
2f740 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
2f750 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
2f760 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
2f770 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
2f780 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2f790 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
2f7a0 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
2f7b0 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
2f7c0 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
2f7d0 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
2f7e0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
2f7f0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
2f800 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
2f810 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2f820 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
2f830 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
2f840 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2f850 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
2f860 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
2f870 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
2f880 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
2f890 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69  rror.  *ppPage i
2f8a0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e  s set to NULL in
2f8b0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
2f8c0 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
2f8d0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
2f8e0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
2f8f0 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
2f900 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
2f910 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
2f920 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
2f930 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
2f940 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
2f950 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
2f960 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
2f970 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
2f980 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
2f990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f9a0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
2f9b0 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
2f9c0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
2f9d0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
2f9e0 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
2f9f0 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
2fa00 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
2fa10 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
2fa20 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
2fa30 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2fa40 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
2fa50 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
2fa60 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
2fa70 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
2fa80 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
2fa90 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
2faa0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
2fab0 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
2fac0 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
2fad0 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
2fae0 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
2faf0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
2fb00 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
2fb10 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
2fb20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2fb30 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
2fb40 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
2fb50 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
2fb60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
2fb70 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
2fb80 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
2fb90 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
2fba0 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2fbb0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
2fbc0 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
2fbd0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
2fbe0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2fbf0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
2fc00 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
2fc10 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
2fc20 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
2fc30 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
2fc40 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2fc50 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
2fc60 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
2fc70 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
2fc80 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2fc90 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
2fca0 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
2fcb0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2fcc0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
2fcd0 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
2fce0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
2fcf0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
2fd00 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2fd10 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2fd20 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
2fd30 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
2fd40 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
2fd50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
2fd60 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
2fd70 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2fd80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2fd90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2fda0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2fdb0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
2fdc0 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
2fdd0 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
2fde0 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
2fdf0 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
2fe00 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2fe10 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
2fe20 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2fe30 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
2fe40 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33  OF: R-05119-0263
2fe50 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  7 The 4-byte big
2fe60 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2fe70 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a  at offset 36.  *
2fe80 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20  * stores stores 
2fe90 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2fea0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2feb0 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20   freelist. */.  
2fec0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
2fed0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2fee0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
2fef0 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
2ff00 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
2ff10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ff20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ff30 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
2ff40 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
2ff50 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
2ff60 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
2ff70 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
2ff80 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
2ff90 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
2ffa0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
2ffb0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
2ffc0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
2ffd0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
2ffe0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61   */.    u32 nSea
2fff0 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  rch = 0;   /* Co
30000 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
30010 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65  r of search atte
30020 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20  mpts */.    .   
30030 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
30040 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
30050 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
30060 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
30070 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
30080 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
30090 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
300a0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
300b0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
300c0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
300d0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
300e0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
300f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30100 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
30110 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
30120 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
30130 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
30140 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
30150 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
30160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
30170 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
30180 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
30190 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
301a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
301b0 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
301c0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
301d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
301e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
301f0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
30200 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
30210 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
30220 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
30230 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30240 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
30250 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
30260 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
30270 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
30280 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
30290 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
302a0 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
302b0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
302c0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
302d0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
302e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
302f0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
30300 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
30310 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
30320 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
30330 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
30340 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30350 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
30360 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
30370 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
30380 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
30390 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
303a0 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
303b0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
303c0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
303d0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
303e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
303f0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
30400 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
30410 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
30420 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
30430 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
30440 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
30450 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
30460 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
30470 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
30480 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
30490 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
304a0 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
304b0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
304c0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
304d0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
304e0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
304f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
30500 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
30510 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
30520 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
30530 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
30540 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
30550 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
30560 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
30570 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
30580 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
30590 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
305a0 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
305b0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
305c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
305d0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
305e0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
305f0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
30600 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
30610 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
30620 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
30630 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
30640 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
30650 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
30660 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
30670 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
30680 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
30690 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
306a0 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
306b0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
306c0 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
306d0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
306e0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
306f0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
30700 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
30710 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
30720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
30730 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
30740 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
30750 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30760 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
30770 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72  pPrevTrunk ? pPr
30780 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20  evTrunk->pgno : 
30790 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
307a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
307b0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
307c0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
307d0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
307e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
307f0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
30800 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
30810 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30820 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
30830 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
30840 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
30850 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
30860 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
30870 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
30880 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
30890 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
308a0 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
308b0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
308c0 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
308d0 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
308e0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
308f0 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
30900 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
30910 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
30920 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
30930 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
30940 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
30950 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
30960 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
30970 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
30980 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
30990 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
309a0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
309b0 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
309c0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
309d0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
309e0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
309f0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
30a00 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
30a10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30a20 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
30a30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30a40 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
30a50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30a60 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30a70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30a80 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
30a90 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
30aa0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
30ab0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
30ac0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
30ad0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
30ae0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
30af0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
30b00 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
30b10 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
30b20 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
30b30 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
30b40 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
30b50 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
30b60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
30b70 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
30b80 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
30b90 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
30ba0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
30bb0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
30bc0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30bd0 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
30be0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30bf0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30c00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30c10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
30c20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
30c30 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
30c40 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
30c50 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
30c60 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
30c70 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
30c80 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
30c90 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
30ca0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
30cb0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
30cc0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
30cd0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
30ce0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
30cf0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
30d00 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
30d10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30d20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
30d30 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
30d40 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
30d50 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
30d60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
30d70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30d80 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
30d90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
30da0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
30db0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30dc0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
30de0 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
30df0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
30e00 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
30e10 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
30e20 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
30e30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30e40 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
30e50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30e70 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
30e80 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
30e90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
30ec0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30ed0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
30ee0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
30ef0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
30f00 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
30f10 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30f20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
30f30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30f40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30f50 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
30f60 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
30f70 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
30f80 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
30f90 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
30fa0 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
30fb0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
30fc0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
30fd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
30fe0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
30ff0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
31000 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
31010 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
31020 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
31030 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
31040 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
31050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31060 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
31070 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
31080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
31090 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e  RRUPT_PGNO(iTrun
310a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
310b0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
310c0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
310d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
310e0 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
310f0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
31100 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
31110 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
31120 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
31130 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
31140 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31160 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
31170 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
31180 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31190 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
311a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
311b0 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
311c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
311d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
311e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
311f0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
31200 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
31210 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31220 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31240 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
31250 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
31260 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
31270 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
31280 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
31290 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
312a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
312b0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
312c0 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
312d0 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
312e0 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
312f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31300 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
31310 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
31320 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
31330 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
31340 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31350 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
31360 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
31370 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
31380 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
31390 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
313a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
313b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
313c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
313d0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
313e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
313f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31400 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31410 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31420 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
31430 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
31440 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
31450 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
31460 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
31470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31480 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
31490 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
314a0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
314b0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
314c0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
314d0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
314e0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
314f0 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
31500 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
31510 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
31520 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
31530 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
31540 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
31550 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
31560 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
31570 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
31580 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
31590 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
315a0 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
315b0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
315c0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
315d0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
315e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
315f0 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
31600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31610 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
31620 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
31630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31640 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
31650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31660 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
31670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31680 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
316a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
316b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
316c0 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
316d0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
316e0 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
316f0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
31700 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
31710 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
31720 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
31730 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
31740 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
31750 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
31760 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
31770 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
31780 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
31790 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
317a0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
317b0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
317c0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
317d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
317e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
317f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31810 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
31820 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
31830 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
31840 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
31850 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
31860 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
31870 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
31880 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
31890 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
318a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
318b0 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
318c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
318d0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
318e0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
318f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31900 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
31910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
31920 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
31930 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
31940 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
31950 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
31960 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
31970 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
31980 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
31990 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
319a0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
319b0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
319c0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
319d0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
319e0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
319f0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
31a00 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
31a10 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
31a20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
31a30 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
31a40 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
31a50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
31a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31a70 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
31a80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
31a90 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
31aa0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
31ac0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
31ad0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
31ae0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
31af0 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
31b00 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
31b10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
31b20 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
31b30 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
31b40 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
31b50 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
31b60 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
31b70 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
31b80 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
31b90 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31ba0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31bb0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
31bc0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
31bd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31be0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31bf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31c00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
31c10 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
31c20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
31c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31c50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
31c60 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
31c70 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
31c80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
31c90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31ca0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
31cb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
31cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
31cd0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
31ce0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
31cf0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
31d00 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
31d10 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
31d20 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
31d30 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
31d40 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
31d50 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
31d60 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
31d70 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
31d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
31d90 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
31da0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
31db0 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
31dc0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
31dd0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
31de0 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
31df0 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
31e00 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
31e10 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
31e20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
31e30 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
31e40 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
31e50 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
31e60 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
31e70 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
31e80 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
31e90 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
31ea0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
31eb0 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
31ec0 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
31ed0 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
31ee0 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
31ef0 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
31f00 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
31f10 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
31f20 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
31f30 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
31f40 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
31f50 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
31f60 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
31f70 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
31f80 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
31f90 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
31fa0 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
31fb0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
31fc0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
31fd0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
31fe0 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
31ff0 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
32000 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
32010 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
32020 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
32030 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
32040 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
32050 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
32060 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
32070 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
32080 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
32090 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
320a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
320b0 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
320c0 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
320d0 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
320e0 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
320f0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
32100 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
32110 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
32120 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
32130 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
32140 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
32150 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
32160 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
32170 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
32180 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
32190 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
321a0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
321b0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
321c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
321d0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
321e0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
321f0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
32200 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
32210 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
32220 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32230 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32240 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
32250 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
32260 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
32270 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
32280 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
32290 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
322a0 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
322b0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
322c0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
322d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
322e0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
322f0 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
32300 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
32310 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
32320 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
32330 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
32340 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
32350 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
32360 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
32370 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
32380 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
32390 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
323a0 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
323b0 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
323c0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
323d0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
323e0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
323f0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
32400 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
32410 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
32420 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
32430 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
32440 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32470 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
32480 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
32490 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
324a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
324b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
324c0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
324d0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
324e0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
324f0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32500 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
32510 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
32520 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
32530 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
32540 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
32550 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
32560 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
32570 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
32580 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
32590 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
325a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
325b0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
325c0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
325d0 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
325e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
325f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
32600 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32610 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
32620 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
32630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32640 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
32650 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
32660 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
32670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
32680 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
32690 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
326a0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
326b0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
326c0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
326d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
326e0 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
326f0 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
32700 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
32710 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
32720 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
32730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
32740 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
32750 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
32760 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d  age)->pDbPage)<=
32770 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  1 );.  assert( r
32780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32790 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
327a0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
327b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
327c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
327d0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
327e0 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
327f0 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
32800 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
32810 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
32820 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
32830 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
32840 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
32850 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
32860 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
32870 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
32880 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32890 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
328a0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
328b0 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
328c0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
328d0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
328e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
328f0 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
32900 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
32910 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
32920 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
32930 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
32940 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
32950 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
32960 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
32970 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
32980 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
32990 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
329a0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
329b0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
329c0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
329d0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
329e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
329f0 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
32a00 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
32a10 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
32a20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32a30 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
32a40 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
32a50 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
32a60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
32a70 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
32a80 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
32a90 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
32aa0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
32ab0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
32ac0 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
32ad0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
32ae0 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
32af0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
32b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b10 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
32b20 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
32b30 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
32b60 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
32b70 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
32b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b90 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
32ba0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
32bb0 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
32bc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
32bd0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
32be0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
32bf0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
32c00 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
32c10 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
32c20 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
32c30 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
32c40 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75  ( iPage<2 ) retu
32c50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
32c60 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d  T_BKPT;.  if( pM
32c70 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
32c80 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
32c90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
32ca0 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
32cb0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
32cc0 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
32cd0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
32ce0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
32cf0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
32d00 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
32d10 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
32d20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32d30 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
32d40 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
32d50 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
32d60 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
32d70 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
32d80 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
32d90 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
32da0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
32db0 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
32dc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
32dd0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
32de0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
32df0 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
32e00 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
32e10 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
32e20 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
32e30 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
32e40 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
32e50 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
32e60 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
32e70 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
32e80 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
32e90 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
32ea0 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
32eb0 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
32ec0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
32ed0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
32ee0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
32ef0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
32f00 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
32f10 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
32f20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
32f30 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
32f40 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
32f50 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
32f60 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
32f70 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
32f80 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
32f90 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
32fa0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
32fb0 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
32fc0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
32fd0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
32fe0 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
32ff0 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
33000 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33010 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
33020 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
33030 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
33040 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
33050 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
33060 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
33070 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
33080 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
33090 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
330a0 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
330b0 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
330c0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
330d0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
330e0 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
330f0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
33100 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
33110 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
33120 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
33130 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
33140 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
33150 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
33160 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
33170 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
33180 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
33190 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
331a0 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
331b0 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
331c0 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
331d0 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
331e0 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
331f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33200 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
33210 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
33220 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
33230 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
33240 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
33250 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
33260 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
33270 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
33280 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
33290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
332a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
332b0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
332c0 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
332d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
332e0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
332f0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
33300 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
33310 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
33320 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
33330 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
33340 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
33350 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33360 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
33370 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
33380 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
33390 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
333a0 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
333b0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
333c0 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
333d0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
333e0 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
333f0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
33400 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
33410 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
33420 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
33430 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
33440 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
33450 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
33460 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
33470 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
33480 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
33490 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
334a0 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
334b0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
334c0 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
334d0 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
334e0 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
334f0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
33500 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
33510 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
33520 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
33530 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
33540 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
33550 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
33560 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
33570 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
33580 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
33590 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
335a0 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
335b0 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
335c0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
335d0 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
335e0 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
335f0 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
33600 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
33610 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
33620 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
33630 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
33640 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
33650 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
33660 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
33670 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
33680 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
33690 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
336a0 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
336b0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
336c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
336d0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
336e0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
336f0 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
33700 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
33710 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
33720 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65  19920-11576 Howe
33730 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69  ver, newer versi
33740 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74  ons of SQLite st
33750 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f  ill.      ** avo
33760 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73  id using the las
33770 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e  t six entries in
33780 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72   the freelist tr
33790 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69  unk page array i
337a0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
337b0 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66   that database f
337c0 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20  iles created by 
337d0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
337e0 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a  f SQLite can be.
337f0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79        ** read by
33800 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
33810 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20  of SQLite..     
33820 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
33830 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33840 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
33850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
33860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33870 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
33880 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
33890 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
338a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
338b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
338c0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
338d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
338e0 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  e && (pBt->btsFl
338f0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
33900 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
33910 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33920 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
33930 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
33940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33950 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
33960 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
33970 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
33980 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
33990 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
339a0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
339b0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
339c0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
339d0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
339e0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
339f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
33a00 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
33a10 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
33a20 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
33a30 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
33a40 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
33a50 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
33a60 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
33a70 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
33a80 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
33a90 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
33aa0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
33ab0 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
33ac0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
33ad0 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
33ae0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
33af0 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
33b00 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
33b10 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
33b20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
33b30 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
33b40 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
33b50 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
33b60 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
33b70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
33b80 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
33b90 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
33ba0 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
33bb0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33bc0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
33bd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33be0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
33bf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33c00 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
33c10 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
33c20 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
33c30 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
33c40 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
33c50 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
33c60 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
33c70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
33c80 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
33c90 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
33ca0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
33cb0 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
33cc0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
33cd0 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
33ce0 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
33cf0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
33d00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
33d10 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
33d20 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
33d30 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
33d40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
33d50 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
33d60 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
33d70 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
33d80 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
33d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
33da0 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
33db0 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
33dc0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
33dd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
33de0 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
33df0 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
33e00 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
33e10 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a  ell.  Write the.
33e20 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69  ** local Cell si
33e30 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f  ze (the number o
33e40 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f  f bytes on the o
33e50 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d  riginal page, om
33e60 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c  itting.** overfl
33e70 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65  ow) into *pnSize
33e80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33e90 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
33ea0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
33eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
33ec0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
33ed0 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
33ee0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
33ef0 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
33f00 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
33f10 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
33f20 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f  pInfo          /
33f30 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * Size informati
33f40 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
33f50 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  l */.){.  BtShar
33f60 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ed *pBt;.  Pgno 
33f70 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
33f80 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
33f90 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
33fa0 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
33fb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
33fc0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
33fd0 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
33fe0 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
33ff0 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
34000 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  );.  if( pInfo->
34010 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e  nLocal==pInfo->n
34020 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72  Payload ){.    r
34030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34040 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
34050 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
34060 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
34070 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
34080 66 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e  f( pCell+pInfo->
34090 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d  nSize-1 > pPage-
340a0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
340b0 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a  skPage ){.    /*
340c0 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61   Cell extends pa
340d0 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a  st end of page *
340e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
340f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
34100 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
34110 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
34120 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b  get4byte(pCell +
34130 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20   pInfo->nSize - 
34140 34 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  4);.  pBt = pPag
34150 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
34160 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
34170 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
34180 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
34190 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
341a0 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d   nOvfl = (pInfo-
341b0 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66  >nPayload - pInf
341c0 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  o->nLocal + ovfl
341d0 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
341e0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
341f0 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c  sert( nOvfl>0 ||
34200 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44   .    (CORRUPT_D
34210 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  B && (pInfo->nPa
34220 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65  yload + ovflPage
34230 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69  Size)<ovflPageSi
34240 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  ze).  );.  while
34250 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
34260 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
34270 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
34280 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
34290 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
342a0 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
342b0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
342c0 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
342d0 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
342e0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
342f0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
34300 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
34310 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
34320 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
34330 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
34340 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
34350 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
34360 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
34370 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
34380 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34390 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
343a0 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
343b0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
343c0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
343d0 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
343e0 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
343f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
34400 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
34410 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
34420 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
34430 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
34440 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
34450 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
34460 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
34470 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
34480 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
34490 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
344a0 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
344b0 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
344c0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
344d0 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
344e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
344f0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
34500 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
34510 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
34520 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
34530 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
34540 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
34550 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
34560 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
34570 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
34580 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
34590 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
345a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
345b0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
345c0 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
345d0 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
345e0 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
345f0 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
34600 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
34610 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
34620 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
34630 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
34640 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
34650 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
34660 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
34670 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
34680 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
34690 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
346a0 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
346b0 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
346c0 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
346d0 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
346e0 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
346f0 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
34700 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
34710 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34720 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
34730 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
34740 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
34750 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
34760 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
34770 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
34780 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
34790 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
347a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
347b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
347c0 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
347d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
347e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
347f0 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
34800 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
34810 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
34820 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
34830 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
34840 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
34850 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
34860 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
34870 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
34880 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
34890 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
348a0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
348b0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
348c0 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
348d0 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
348e0 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
348f0 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
34900 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
34910 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
34920 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
34930 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
34940 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
34950 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
34960 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
34970 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
34980 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
34990 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
349a0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
349b0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
349c0 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
349d0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
349e0 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
349f0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
34a00 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
34a10 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
34a20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
34a30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
34a40 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
34a50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
34a60 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
34a70 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
34a80 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
34a90 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64  nst BtreePayload
34aa0 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20   *pX,        /* 
34ab0 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69  Payload with whi
34ac0 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  ch to construct 
34ad0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
34ae0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34b00 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
34b10 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
34b20 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
34b30 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
34b40 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
34b50 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
34b60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
34b70 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
34b80 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
34b90 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
34ba0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
34bb0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
34bc0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
34bd0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
34be0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
34bf0 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
34c00 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
34c10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
34c20 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
34c30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
34c40 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
34c50 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
34c60 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
34c70 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
34c80 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
34c90 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
34ca0 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
34cb0 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
34cc0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
34cd0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
34ce0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
34cf0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
34d00 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
34d10 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
34d20 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34d30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
34d40 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
34d50 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
34d60 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67    nHeader = pPag
34d70 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
34d80 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
34d90 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79  tKey ){.    nPay
34da0 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61  load = pX->nData
34db0 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20   + pX->nZero;.  
34dc0 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61    pSrc = pX->pDa
34dd0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70  ta;.    nSrc = p
34de0 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73  X->nData;.    as
34df0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
34e00 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69  KeyLeaf ); /* fi
34e10 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
34e20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65  called for leave
34e30 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72  s */.    nHeader
34e40 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
34e50 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
34e60 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
34e70 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
34e80 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
34e90 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58  der], *(u64*)&pX
34ea0 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  ->nKey);.  }else
34eb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  {.    assert( pX
34ec0 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66  ->nKey<=0x7fffff
34ed0 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d  ff && pX->pKey!=
34ee0 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  0 );.    nSrc = 
34ef0 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29  nPayload = (int)
34f00 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53  pX->nKey;.    pS
34f10 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20  rc = pX->pKey;. 
34f20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
34f30 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
34f40 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
34f50 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  oad);.  }.  .  /
34f60 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
34f70 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66 28 20 6e  yload */.  if( n
34f80 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
34f90 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
34fa0 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
34fb0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
34fc0 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
34fd0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
34fe0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
34ff0 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
35000 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
35010 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
35020 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
35030 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
35040 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
35050 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
35060 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
35070 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
35080 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
35090 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
350a0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
350b0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
350c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
350d0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
350e0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
350f0 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
35100 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
35110 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
35120 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
35130 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
35140 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
35150 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
35160 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
35170 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
35180 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
35190 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
351a0 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
351b0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
351c0 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
351d0 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
351e0 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
351f0 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
35200 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
35210 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
35220 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
35230 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
35240 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
35250 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
35260 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
35270 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
35280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35290 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
352a0 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
352b0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
352c0 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
352d0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
352e0 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
352f0 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
35300 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
35310 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
35320 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
35330 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
35340 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
35350 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
35360 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
35370 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
35380 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
35390 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
353a0 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
353b0 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
353c0 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
353d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
353e0 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49  UG.  {.    CellI
353f0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50  nfo info;.    pP
35400 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
35410 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
35420 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
35430 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29  ( nHeader==(int)
35440 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  (info.pPayload -
35450 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61   pCell) );.    a
35460 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
35470 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  ==pX->nKey );.  
35480 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a    assert( *pnSiz
35490 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20  e == info.nSize 
354a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
354b0 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f  paceLeft == info
354c0 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23  .nLocal );.  }.#
354d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74  endif..  /* Writ
354e0 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
354f0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c  to the local Cel
35500 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20  l and any extra 
35510 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
35520 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ges */.  while( 
35530 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
35540 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
35550 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
35560 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
35570 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
35580 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
35590 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
355a0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
355b0 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
355c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
355d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
355e0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
355f0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
35600 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
35610 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
35620 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
35630 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
35640 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
35650 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
35660 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
35670 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
35680 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
35690 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
356a0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
356b0 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
356c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
356d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
356e0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
356f0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
35700 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
35710 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
35720 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
35730 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
35740 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
35750 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
35760 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
35770 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
35780 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
35790 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
357a0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
357b0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
357c0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
357d0 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
357e0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
357f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
35800 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
35810 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
35820 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
35830 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
35840 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
35850 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
35860 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
35870 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
35880 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
35890 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
358a0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
358b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
358c0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
358d0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
358e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
358f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
35900 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
35910 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
35920 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
35930 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
35940 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
35950 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
35960 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
35970 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
35980 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
35990 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
359a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
359b0 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
359c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
359d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
359e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
359f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
35a00 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
35a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35a20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
35a30 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
35a40 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
35a50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
35a60 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
35a70 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
35a80 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
35a90 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
35aa0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
35ab0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
35ac0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
35ad0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
35ae0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
35af0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
35b00 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
35b10 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
35b20 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
35b30 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
35b40 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
35b50 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
35b60 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
35b70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
35b80 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
35b90 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
35ba0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
35bb0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
35bc0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
35bd0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35be0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
35bf0 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
35c00 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
35c10 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
35c20 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
35c30 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
35c40 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
35c50 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
35c60 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
35c70 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
35c80 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
35c90 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
35ca0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
35cb0 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
35cc0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
35cd0 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
35ce0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
35cf0 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
35d00 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
35d10 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
35d20 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
35d30 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
35d40 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
35d50 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
35d60 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
35d70 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
35d80 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
35d90 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
35da0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
35db0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
35dc0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35dd0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
35de0 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
35df0 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
35e00 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
35e10 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
35e20 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
35e30 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
35e40 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
35e50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
35e60 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
35e70 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
35e80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
35e90 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
35ea0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
35eb0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
35ec0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
35ed0 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
35ee0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
35ef0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
35f00 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
35f10 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
35f20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
35f30 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
35f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
35f50 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
35f60 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
35f70 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
35f80 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
35f90 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
35fa0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
35fb0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
35fc0 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   n;.  }.  releas
35fd0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
35fe0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
35ff0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
36000 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
36010 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
36020 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
36030 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
36040 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
36050 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
36060 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
36070 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
36080 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
36090 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
360a0 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
360b0 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
360c0 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
360d0 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
360e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
360f0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
36100 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
36110 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
36120 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
36130 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
36140 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
36150 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
36160 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
36170 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
36180 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
36190 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
361a0 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
361b0 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
361c0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
361d0 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
361e0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
361f0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
36200 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
36210 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
36220 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
36230 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
36240 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
36250 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
36260 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
36270 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
36280 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
36290 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
362a0 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
362b0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
362c0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
362d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
362e0 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d  RRUPT_DB || sz==
362f0 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
36300 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
36310 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
36320 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
36330 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
36340 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
36350 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
36360 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
36370 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
36380 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
36390 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
363a0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
363b0 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
363c0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
363d0 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
363e0 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
363f0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
36400 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
36410 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
36420 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
36430 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
36440 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
36450 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
36460 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
36470 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
36480 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
36490 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
364a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
364b0 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
364c0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
364d0 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
364e0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
364f0 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
36500 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  nCell--;.  if( p
36510 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
36520 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
36530 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
36540 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
36550 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62  ] = 0;.    put2b
36560 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
36570 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
36580 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  ableSize);.    p
36590 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
365a0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
365b0 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64  Size - pPage->hd
365c0 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  rOffset.        
365d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
365e0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
365f0 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73  Size - 8;.  }els
36600 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  e{.    memmove(p
36610 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
36620 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
36630 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ));.    put2byte
36640 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
36650 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
36660 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
36670 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 2;.  }.}../*.*
36680 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
36690 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
366a0 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
366b0 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
366c0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
366d0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
366e0 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
366f0 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
36700 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
36710 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
36720 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
36730 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
36740 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
36750 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
36760 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
36770 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
36780 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
36790 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
367a0 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
367b0 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
367c0 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
367d0 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
367e0 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
367f0 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
36800 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
36810 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
36820 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
36830 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
36840 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
36850 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
36860 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
36870 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
36880 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
36890 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20 62 65 20  ** *pRC must be 
368a0 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
368b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
368c0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
368d0 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
368e0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
368f0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
36900 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
36910 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
36920 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
36930 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
36940 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
36950 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
36960 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
36970 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
36980 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
36990 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
369a0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
369b0 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
369c0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
369d0 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
369e0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
369f0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
36a00 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
36a10 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
36a20 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
36a30 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
36a40 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
36a50 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
36a60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
36a70 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
36a80 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
36a90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
36aa0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
36ab0 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
36ac0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
36ad0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
36ae0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
36af0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
36b00 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
36b10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
36b20 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
36b30 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
36b40 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIns;         /*
36b50 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50   The point in pP
36b60 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20  age->aCellIdx[] 
36b70 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e  where no cell in
36b80 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73 73  serted */..  ass
36b90 65 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49 54  ert( *pRC==SQLIT
36ba0 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
36bb0 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
36bc0 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
36bd0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
36be0 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28  assert( MX_CELL(
36bf0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
36c00 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  21 );.  assert( 
36c10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
36c20 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
36c30 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
36c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36c50 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
36c60 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
36c70 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
36c80 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
36c90 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
36ca0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
36cb0 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
36cc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
36cd0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
36ce0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
36cf0 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
36d00 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
36d10 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
36d20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
36d30 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
36d40 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
36d50 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
36d60 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
36d70 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
36d80 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
36d90 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
36da0 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
36db0 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
36dc0 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
36dd0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
36de0 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
36df0 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
36e00 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
36e10 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
36e20 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
36e30 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
36e40 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
36e50 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
36e60 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c  sz==pPage->xCell
36e70 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c  Size(pPage, pCel
36e80 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
36e90 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
36ea0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
36eb0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
36ec0 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
36ed0 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
36ee0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
36ef0 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20   pCell, sz);.   
36f00 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
36f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36f20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
36f30 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
36f40 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
36f50 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
36f60 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 2f  verflow++;.    /
36f70 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  * Comparison aga
36f80 69 6e 73 74 20 41 72 72 61 79 53 69 7a 65 2d 31  inst ArraySize-1
36f90 20 73 69 6e 63 65 20 77 65 20 68 6f 6c 64 20 62   since we hold b
36fa0 61 63 6b 20 6f 6e 65 20 65 78 74 72 61 20 73 6c  ack one extra sl
36fb0 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 63  ot.    ** as a c
36fc0 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e 20  ontingency.  In 
36fd0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6e 65 76  other words, nev
36fe0 65 72 20 6e 65 65 64 20 6d 6f 72 65 20 74 68 61  er need more tha
36ff0 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  n 3 overflow.   
37000 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74 20 34 20   ** slots but 4 
37010 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 6a  are allocated, j
37020 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
37030 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  */.    assert( j
37040 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 50 61   < ArraySize(pPa
37050 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31 20 29 3b  ge->apOvfl)-1 );
37060 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
37070 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
37080 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
37090 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20  [j] = (u16)i;.. 
370a0 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69     /* When multi
370b0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63  ple overflows oc
370c0 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c  cur, they are al
370d0 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20  ways sequential 
370e0 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  and in.    ** so
370f0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69  rted order.  Thi
37100 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69  s invariants ari
37110 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69  se because multi
37120 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61  ple overflows ca
37130 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63  n.    ** only oc
37140 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69  cur when inserti
37150 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ng divider cells
37160 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
37170 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20   page during.   
37180 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61   ** balancing, a
37190 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20  nd the dividers 
371a0 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64  are adjacent and
371b0 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   sorted..    */.
371c0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
371d0 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66   || pPage->aiOvf
371e0 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b  l[j-1]<(u16)i );
371f0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e   /* Overflows in
37200 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f   sorted order */
37210 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
37220 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61  0 || i==pPage->a
37230 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20  iOvfl[j-1]+1 ); 
37240 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61    /* Overflows a
37250 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f  re sequential */
37260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
37270 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
37280 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
37290 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
372a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
372b0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
372c0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
372d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
372e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
372f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
37300 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
37310 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
37320 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >aData;.    asse
37330 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d  rt( &data[pPage-
37340 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50  >cellOffset]==pP
37350 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b  age->aCellIdx );
37360 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
37370 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
37380 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
37390 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
373a0 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
373b0 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
373c0 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
373d0 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
373e0 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74  ollowing propert
373f0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
37400 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
37410 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73  fully */.    ass
37420 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b  ert( idx >= 0 );
37430 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
37440 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f   >= pPage->cellO
37450 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
37460 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50  Cell+2 || CORRUP
37470 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  T_DB );.    asse
37480 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
37490 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
374a0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
374b0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
374c0 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
374d0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
374e0 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a  [idx], pCell, sz
374f0 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
37500 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
37510 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
37520 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
37530 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d     pIns = pPage-
37540 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b  >aCellIdx + i*2;
37550 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e  .    memmove(pIn
37560 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50  s+2, pIns, 2*(pP
37570 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29  age->nCell - i))
37580 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
37590 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  Ins, idx);.    p
375a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
375b0 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20     /* increment 
375c0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a  the cell count *
375d0 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74  /.    if( (++dat
375e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
375f0 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61  et+4])==0 ) data
37600 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
37610 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65  t+3]++;.    asse
37620 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
37630 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
37640 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+3])==pPage->
37650 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66  nCell );.#ifndef
37660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
37670 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
37680 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
37690 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
376a0 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
376b0 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
376c0 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
376d0 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
376e0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
376f0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
37700 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
37710 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
37720 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
37730 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
37740 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
37750 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e   pRC);.    }.#en
37760 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
37770 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a   A CellArray obj
37780 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ect contains a c
37790 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73  ache of pointers
377a0 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61   and sizes for a
377b0 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20  .** consecutive 
377c0 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c  sequence of cell
377d0 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  s that might be 
377e0 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69 70 6c 65  held on multiple
377f0 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64   pages..*/.typed
37800 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41 72  ef struct CellAr
37810 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73  ray CellArray;.s
37820 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
37830 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  {.  int nCell;  
37840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37850 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
37860 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
37870 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20 20  MemPage *pRef;  
37880 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
37890 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  ence page */.  u
378a0 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
378b0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
378c0 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
378d0 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
378e0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
378f0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
37900 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
37910 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  Cell[] */.};../*
37920 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
37930 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74 20  e cell sizes at 
37940 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c  idx, idx+1, ...,
37950 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62 65   idx+N-1 have be
37960 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a  en.** computed..
37970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
37980 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68 65  opulateCellCache
37990 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
379a0 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a  nt idx, int N){.
379b0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
379c0 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43   && idx+N<=p->nC
379d0 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ell );.  while( 
379e0 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  N>0 ){.    asser
379f0 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  t( p->apCell[idx
37a00 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
37a10 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d  p->szCell[idx]==
37a20 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a  0 ){.      p->sz
37a30 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70  Cell[idx] = p->p
37a40 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
37a50 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
37a60 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c  l[idx]);.    }el
37a70 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
37a80 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a  ( CORRUPT_DB ||.
37a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
37aa0 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d  >szCell[idx]==p-
37ab0 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
37ac0 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
37ad0 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20  ell[idx]) );.   
37ae0 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20   }.    idx++;.  
37af0 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a    N--;.  }.}../*
37b00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
37b10 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20 65  ize of the Nth e
37b20 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63 65  lement of the ce
37b30 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74  ll array.*/.stat
37b40 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
37b50 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43 65  NE u16 computeCe
37b60 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79  llSize(CellArray
37b70 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
37b80 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e  ssert( N>=0 && N
37b90 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  <p->nCell );.  a
37ba0 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c  ssert( p->szCell
37bb0 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  [N]==0 );.  p->s
37bc0 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52  zCell[N] = p->pR
37bd0 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
37be0 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
37bf0 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  [N]);.  return p
37c00 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73  ->szCell[N];.}.s
37c10 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65 64  tatic u16 cached
37c20 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72  CellSize(CellArr
37c30 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  ay *p, int N){. 
37c40 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26   assert( N>=0 &&
37c50 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20   N<p->nCell );. 
37c60 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e   if( p->szCell[N
37c70 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ] ) return p->sz
37c80 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72  Cell[N];.  retur
37c90 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a  n computeCellSiz
37ca0 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(p, N);.}../*.*
37cb0 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
37cc0 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
37cd0 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72  rs to nCell b-tr
37ce0 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54  ee page cells. T
37cf0 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20  he .** szCell[] 
37d00 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74  array contains t
37d10 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
37d20 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54   of each cell. T
37d30 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
37d40 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75 72  replaces the cur
37d50 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
37d60 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20 74   page pPg with t
37d70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
37d80 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79  he cell.** array
37d90 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20  ..**.** Some of 
37da0 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  the cells in apC
37db0 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e  ell[] may curren
37dc0 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  tly be stored in
37dd0 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75   pPg. This.** fu
37de0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f  nction works aro
37df0 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
37e00 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20 6d  sed by this by m
37e10 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20  aking a copy of 
37e20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c  any .** such cel
37e30 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  ls before overwr
37e40 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20 64  iting the page d
37e50 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d  ata..**.** The M
37e60 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65  emPage.nFree fie
37e70 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65  ld is invalidate
37e80 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
37e90 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  on. It is the .*
37ea0 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
37eb0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
37ec0 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63 74  o set it correct
37ed0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
37ee0 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20  t rebuildPage(. 
37ef0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
37f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f10 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61   /* Edit this pa
37f20 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ge */.  int nCel
37f30 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37f40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
37f50 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
37f60 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   on page */.  u8
37f70 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
37f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37f90 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
37fa0 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
37fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fc0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
37fd0 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
37fe0 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
37ff0 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
38000 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
38010 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
38020 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20   on pPg */.  u8 
38030 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
38040 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  pPg->aData;     
38050 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
38060 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67   to data for pPg
38070 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
38080 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
38090 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
380a0 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  e;.  u8 * const 
380b0 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73  pEnd = &aData[us
380c0 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74  ableSize];.  int
380d0 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   i;.  u8 *pCellp
380e0 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
380f0 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  dx;.  u8 *pTmp =
38100 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
38110 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
38120 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a  >pPager);.  u8 *
38130 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65  pData;..  i = ge
38140 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
38150 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
38160 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61  &pTmp[i], &aData
38170 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  [i], usableSize 
38180 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d  - i);..  pData =
38190 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30   pEnd;.  for(i=0
381a0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
381b0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
381c0 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
381d0 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
381e0 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61 2c 70 45  N(pCell,aData,pE
381f0 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 70 43 65  nd) ){.      pCe
38200 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c  ll = &pTmp[pCell
38210 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d   - aData];.    }
38220 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a  .    pData -= sz
38230 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Cell[i];.    put
38240 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
38250 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 29  (pData - aData))
38260 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b  ;.    pCellptr +
38270 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44 61  = 2;.    if( pDa
38280 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29 20  ta < pCellptr ) 
38290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
382a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
382b0 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43  memcpy(pData, pC
382c0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b  ell, szCell[i]);
382d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 43  .    assert( szC
382e0 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65  ell[i]==pPg->xCe
382f0 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65 6c  llSize(pPg, pCel
38300 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
38310 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
38320 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67  ( szCell[i]!=pPg
38330 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
38340 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20  pCell) );.  }.. 
38350 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72   /* The pPg->nFr
38360 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20  ee field is now 
38370 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
38380 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
38390 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50   fix it. */.  pP
383a0 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c  g->nCell = nCell
383b0 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
383c0 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
383d0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31  yte(&aData[hdr+1
383e0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74  ], 0);.  put2byt
383f0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c  e(&aData[hdr+3],
38400 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20   pPg->nCell);.  
38410 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
38420 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20  hdr+5], pData - 
38430 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b  aData);.  aData[
38440 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20  hdr+7] = 0x00;. 
38450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
38460 4b 3b 0