/ Hex Artifact Content
Login

Artifact be3ac34a9d669fed0e0b315e4b62fb198b3534a1:


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 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 73 74  Bt->mutex);.}.st
3ba0: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f  atic int cursorO
3bb0: 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75  wnsBtShared(BtCu
3bc0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
3bd0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3be0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74  utex(p) );.  ret
3bf0: 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e  urn (p->pBtree->
3c00: 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b  db==p->pBt->db);
3c10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3c20: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
3c30: 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f  overflow cache o
3c40: 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73  f the cursor pas
3c50: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
3c60: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e   argument..** on
3c70: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3c80: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3c90: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61  .*/.#define inva
3ca0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3cb0: 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d  che(pCur) (pCur-
3cc0: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
3cd0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f  CF_ValidOvfl)../
3ce0: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3cf0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3d00: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3d10: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3d20: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
3d30: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
3d40: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3d60: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
3d70: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
3d80: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3d90: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3da0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3db0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3dc0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3dd0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3de0: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3df0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3e00: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  (p);.  }.}..#ifn
3e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3e20: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54  INCRBLOB./*.** T
3e30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3e40: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f  called before mo
3e50: 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
3e60: 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a  ents of a table.
3e70: 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
3e80: 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
3e90: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f  rsors that are o
3ea0: 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f  pen on the.** ro
3eb0: 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  w or one of the 
3ec0: 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66  rows being modif
3ed0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ied..**.** If ar
3ee0: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3ef0: 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ble is true, the
3f00: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  n the entire con
3f10: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
3f20: 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74  table is about t
3f30: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e  o be deleted. In
3f40: 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c   this case inval
3f50: 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c  idate all incrbl
3f60: 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70  ob.** cursors op
3f70: 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69  en on any row wi
3f80: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77  thin the table w
3f90: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67  ith root-page pg
3fa0: 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  noRoot..**.** Ot
3fb0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75  herwise, if argu
3fc0: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3fd0: 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  e is false, then
3fe0: 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a   the row with.**
3ff0: 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62   rowid iRow is b
4000: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72  eing replaced or
4010: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
4020: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
4030: 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20  e.** only those 
4040: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
4050: 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70   open on that sp
4060: 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73  ecific row..*/.s
4070: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
4080: 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
4090: 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70  sors(.  Btree *p
40a0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Btree,          
40b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
40c0: 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
40d0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
40e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
40f0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
4100: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
4110: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
4120: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
4130: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
4140: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4150: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4160: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4170: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4180: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4190: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
41a0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
41b0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
41c0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
41d0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
41e0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
41f0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
4200: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4210: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
4220: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
4230: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
4240: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4250: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4260: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c   isClearTable ||
4270: 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
4280: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Row ){.        p
4290: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
42a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
42b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
42c0: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
42d0: 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e  function when IN
42e0: 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65  CRBLOB is omitte
42f0: 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69  d */.  #define i
4300: 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f  nvalidateIncrblo
4310: 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a  bCursors(x,y,z).
4320: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4330: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
4340: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74  /../*.** Set bit
4350: 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53   pgno of the BtS
4360: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4370: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69  t bitvec. This i
4380: 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65  s called .** whe
4390: 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72  n a page that pr
43a0: 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e  eviously contain
43b0: 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20  ed data becomes 
43c0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
43d0: 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   .** page..**.**
43e0: 20 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   The BtShared.pH
43f0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4400: 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20   exists to work 
4410: 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72  around an obscur
4420: 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20  e.** bug caused 
4430: 62 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69  by the interacti
4440: 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c  on of two useful
4450: 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IO optimization
4460: 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a  s surrounding.**
4470: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4480: 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  pages:.**.**   1
4490: 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  ) When all data 
44a0: 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
44b0: 61 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70  a page and the p
44c0: 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20  age becomes.**  
44d0: 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20      a free-list 
44e0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70  leaf page, the p
44f0: 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  age is not writt
4500: 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
4510: 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66  se.**      (as f
4520: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4530: 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d  ges contain no m
4540: 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e  eaningful data).
4550: 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20   Sometimes.**   
4560: 20 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69     such a page i
4570: 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e  s not even journ
4580: 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c  alled (as it wil
4590: 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  l not be modifie
45a0: 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62  d,.**      why b
45b0: 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e  other journallin
45c0: 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  g it?)..**.**   
45d0: 32 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c  2) When a free-l
45e0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
45f0: 20 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e   reused, its con
4600: 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64  tent is not read
4610: 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
4620: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72  e database or wr
4630: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4640: 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73  rnal file (why s
4650: 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20  hould it.**     
4660: 20 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f   be, if it is no
4670: 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67  t at all meaning
4680: 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20  ful?)..**.** By 
4690: 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73  themselves, thes
46a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
46b0: 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72  work fine and pr
46c0: 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a  ovide a handy.**
46d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
46e0: 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74  st to bulk delet
46f0: 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72  e or insert oper
4700: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
4710: 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73   if.** a page is
4720: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
4730: 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e  ee-list and then
4740: 20 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74   reused within t
4750: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73  he same.** trans
4760: 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65  action, a proble
4770: 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74  m comes up. If t
4780: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a  he page is not j
4790: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a  ournalled when.*
47a0: 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f  * it is moved to
47b0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
47c0: 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f  nd it is also no
47d0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
47e0: 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61  n it.** is extra
47f0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4800: 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73  ee-list and reus
4810: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ed, then the ori
4820: 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61  ginal data.** ma
4830: 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68  y be lost. In th
4840: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
4850: 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f  lback, it may no
4860: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a  t be possible.**
4870: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
4880: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
4890: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
48a0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
48b0: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68  e solution is th
48c0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
48d0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57  ontent bitvec. W
48e0: 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69  henever a page i
48f0: 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62  s .** moved to b
4900: 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73  ecome a free-lis
4910: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4920: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4930: 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20  it is.** set in 
4940: 74 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e  the bitvec. When
4950: 65 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65  ever a leaf page
4960: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
4970: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
4980: 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ,.** optimizatio
4990: 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69  n 2 above is omi
49a0: 74 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72  tted if the corr
49b0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
49c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
49d0: 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  in BtShared.pHas
49e0: 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e  Content. The con
49f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74  tents of the bit
4a00: 76 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a  vec are cleared.
4a10: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
4a20: 20 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69   every transacti
4a30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4a40: 74 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  t btreeSetHasCon
4a50: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4a60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4a70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4a80: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74  E_OK;.  if( !pBt
4a90: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4aa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
4ab0: 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b  o<=pBt->nPage );
4ac0: 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  .    pBt->pHasCo
4ad0: 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  ntent = sqlite3B
4ae0: 69 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d  itvecCreate(pBt-
4af0: 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  >nPage);.    if(
4b00: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4b10: 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
4b20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
4b30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
4b40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4b50: 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74  K && pgno<=sqlit
4b60: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74  e3BitvecSize(pBt
4b70: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29  ->pHasContent) )
4b80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
4b90: 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d  e3BitvecSet(pBt-
4ba0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67  >pHasContent, pg
4bb0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
4bc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51  n rc;.}../*.** Q
4bd0: 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65  uery the BtShare
4be0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65  d.pHasContent ve
4bf0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ctor..**.** This
4c00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4c10: 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d  led when a free-
4c20: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69  list leaf page i
4c30: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
4c40: 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  he.** free-list 
4c50: 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65  for reuse. It re
4c60: 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69  turns false if i
4c70: 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74  t is safe to ret
4c80: 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67  rieve the.** pag
4c90: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
4ca0: 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
4cb0: 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
4cc0: 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65  g set. True othe
4cd0: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
4ce0: 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73   int btreeGetHas
4cf0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d00: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4d10: 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d  ){.  Bitvec *p =
4d20: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
4d30: 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  t;.  return (p &
4d40: 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42  & (pgno>sqlite3B
4d50: 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20  itvecSize(p) || 
4d60: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
4d70: 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a  t(p, pgno)));.}.
4d80: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65  ./*.** Clear (de
4d90: 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61  stroy) the BtSha
4da0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4db0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f  bitvec. This sho
4dc0: 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65  uld be.** invoke
4dd0: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
4de0: 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74  ion of each writ
4df0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e-transaction..*
4e00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e10: 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
4e20: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4e30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ){.  sqlite3Bitv
4e40: 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70  ecDestroy(pBt->p
4e50: 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70  HasContent);.  p
4e60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4e70: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
4e80: 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  lease all of the
4e90: 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20   apPage[] pages 
4ea0: 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
4eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
4ec0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
4ed0: 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72  orPages(BtCursor
4ee0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
4ef0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
4f00: 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
4f10: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
4f20: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
4f30: 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  i]);.    pCur->a
4f40: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4f50: 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  }.  pCur->iPage 
4f60: 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  = -1;.}../*.** T
4f70: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
4f80: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
4f90: 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74  ument must point
4fa0: 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
4fb0: 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  y.** when this f
4fc0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4fd0: 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74  d (i.e. have eSt
4fe0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
4ff0: 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  D). This.** func
5000: 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63  tion saves the c
5010: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65  urrent cursor ke
5020: 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70  y in variables p
5030: 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a  Cur->nKey and.**
5040: 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c   pCur->pKey. SQL
5050: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5060: 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
5070: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
5080: 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  ror .** code oth
5090: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
50a0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
50b0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79  pen on an intkey
50c0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
50d0: 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20   integer key.** 
50e0: 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73  (the rowid) is s
50f0: 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e  tored in pCur->n
5100: 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b  Key and pCur->pK
5110: 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74  ey is left set t
5120: 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68  o.** NULL. If th
5130: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
5140: 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   on a non-intkey
5150: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75   table, then pCu
5160: 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73  r->pKey is .** s
5170: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
5180: 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72   malloced buffer
5190: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
51a0: 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
51b0: 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79  ning .** the key
51c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
51d0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74  saveCursorKey(Bt
51e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
51f0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
5200: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5210: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
5220: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
5230: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
5240: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5250: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5260: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5270: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5280: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5290: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
52a0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
52b0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
52c0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
52d0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
52e0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
52f0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
5300: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
5310: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
5320: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
5330: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5340: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5350: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5360: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5370: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5380: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5390: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
53a0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
53b0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
53c0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
53d0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
53e0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
53f0: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43    */.  if( 0==pC
5400: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5410: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
5420: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
5430: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20   pCur->nKey );. 
5440: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
5450: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5460: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
5470: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
5480: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
5490: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
54a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
54b0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
54c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
54e0: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
54f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5500: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5510: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
5520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
5530: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5540: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
5550: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5560: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5570: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5580: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
5590: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
55a0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
55b0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
55c0: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
55d0: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
55e0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
55f0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
5600: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
5610: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
5620: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
5630: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
5640: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
5650: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
5660: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
5670: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
5680: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5690: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
56a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
56b0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
56c0: 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52  eState || CURSOR
56d0: 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d  _SKIPNEXT==pCur-
56e0: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
56f0: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
5700: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
5710: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
5720: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28  (pCur) );..  if(
5730: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5740: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
5750: 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
5760: 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
5770: 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
5780: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
5790: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
57a0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70 43  saveCursorKey(pC
57b0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
57c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
57d0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
57e0: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
57f0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5800: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5810: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5820: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
5830: 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
5840: 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
5850: 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a  l|BTCF_AtLast);.
5860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5870: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5880: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
5890: 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
58a0: 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  NE saveCursorsOn
58b0: 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50  List(BtCursor*,P
58c0: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
58d0: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
58e0: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
58f0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
5900: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
5910: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
5920: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
5930: 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22  t-page iRoot.  "
5940: 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f  Saving the curso
5950: 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e  r position" mean
5960: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f  s that.** the lo
5970: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74  cation in the bt
5980: 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65  ree is remembere
5990: 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  d in such a way 
59a0: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a  that it can be.*
59b0: 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20  * moved back to 
59c0: 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66  the same spot af
59d0: 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61  ter the btree ha
59e0: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
59f0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
5a00: 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  e is called just
5a10: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70   before cursor p
5a20: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
5a30: 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20  o modify the.** 
5a40: 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70  table, for examp
5a50: 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74  le in BtreeDelet
5a60: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
5a70: 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rt()..**.** If t
5a80: 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
5a90: 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
5aa0: 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
5ab0: 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a  then all such .*
5ac0: 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64  * cursors should
5ad0: 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43 46   have their BTCF
5ae0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5af0: 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43 75  et.  The btreeCu
5b00: 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  rsor().** routin
5b10: 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74 20  e enforces that 
5b20: 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  rule.  This rout
5b30: 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74  ine only needs t
5b40: 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a  o be called in.*
5b50: 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63  * the uncommon c
5b60: 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63 74  ase when pExpect
5b70: 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d 75   has the BTCF_Mu
5b80: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5b90: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65 63  .**.** If pExpec
5ba0: 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e  t!=NULL and if n
5bb0: 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  o other cursors 
5bc0: 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65  are found on the
5bd0: 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c   same root-page,
5be0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54 43  .** then the BTC
5bf0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5c00: 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63 6c  on pExpect is cl
5c10: 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64 20  eared, to avoid 
5c20: 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74  another.** point
5c30: 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68 69  less call to thi
5c40: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
5c50: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5c60: 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75 74  note:  This rout
5c70: 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b  ine merely check
5c80: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20  s to see if any 
5c90: 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20  cursors.** need 
5ca0: 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49 74  to be saved.  It
5cb0: 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61   calls out to sa
5cc0: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5cd0: 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75 61  ) in the (unusua
5ce0: 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61 74  l).** event that
5cf0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 20   cursors are in 
5d00: 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73 61  need to being sa
5d10: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
5d20: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
5d30: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
5d40: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
5d50: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
5d60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
5d70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5d90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
5da0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
5db0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5dc0: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5dd0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5de0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5df0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5e00: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5e10: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5e20: 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  Root) ) break;. 
5e30: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65 74   }.  if( p ) ret
5e40: 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73 4f  urn saveCursorsO
5e50: 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20  nList(p, iRoot, 
5e60: 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28 20  pExcept);.  if( 
5e70: 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65 70  pExcept ) pExcep
5e80: 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  t->curFlags &= ~
5e90: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
5ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5eb0: 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65  K;.}../* This he
5ec0: 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20  lper routine to 
5ed0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20 64  saveAllCursors d
5ee0: 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77  oes the actual w
5ef0: 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a  ork of saving.**
5f00: 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66 20   the cursors if 
5f10: 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73 6f  and when a curso
5f20: 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  r is found that 
5f30: 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
5f40: 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65  s saving..** The
5f50: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20   common case is 
5f60: 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73 20  that no cursors 
5f70: 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64  need to be saved
5f80: 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
5f90: 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f  e is.** broken o
5fa0: 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c  ut from its call
5fb0: 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  er to avoid unne
5fc0: 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70 6f  cessary stack po
5fd0: 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a  inter movement..
5fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5ff0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
6000: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
6010: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c 20  .  BtCursor *p, 
6020: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
6030: 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61 74  irst cursor that
6040: 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a 2f   needs saving */
6050: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
6070: 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74 68  save cursor with
6080: 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61 76   this iRoot. Sav
6090: 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f  e all if zero */
60a0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
60b0: 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  cept    /* Do no
60c0: 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73  t save this curs
60d0: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20  or */.){.  do{. 
60e0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
60f0: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
6100: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
6110: 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Root) ){.      i
6120: 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
6130: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
6140: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6150: 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
6160: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
6170: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6180: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
6190: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
61a0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
61b0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
61c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
61d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
61e0: 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->iPage>0 );.   
61f0: 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
6200: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
6210: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6220: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
6230: 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
6240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6250: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6260: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
6270: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
6280: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6290: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
62a0: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
62b0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
62c0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
62d0: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
62e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
62f0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
6300: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
6310: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6320: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
6330: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
6340: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
6350: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
6360: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
6370: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
6380: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
6390: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
63a0: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
63b0: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
63c0: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
63d0: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
63e0: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
63f0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6400: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
6410: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
6420: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
6430: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
6440: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
6450: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
6460: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
6470: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
6480: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
6490: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
64a0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
64b0: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
64c0: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
64d0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
64e0: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
64f0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
6500: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
6510: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
6520: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
6530: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
6540: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6550: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6560: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
6570: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
6580: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
6590: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
65a0: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
65b0: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30    char aSpace[20
65c0: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
65d0: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
65e0: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
65f0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20  d a malloc */.  
6600: 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b  char *pFree = 0;
6610: 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
6620: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
6630: 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
6640: 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
6650: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
6660: 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
6670: 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  (.        pCur->
6680: 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65  pKeyInfo, aSpace
6690: 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
66a0: 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a  , &pFree.    );.
66b0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
66c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
66d0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
66e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
66f0: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
6700: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
6710: 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78  nKey, pKey, pIdx
6720: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  Key);.    if( pI
6730: 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30  dxKey->nField==0
6740: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6750: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
6760: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
6770: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
6780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6790: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BKPT;.    }.  }e
67a0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
67b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
67c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
67d0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
67e0: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
67f0: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20   bias, pRes);.  
6800: 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
6810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6820: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6830: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  b, pFree);.  }. 
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6850: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6860: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6870: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6880: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6890: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
68a0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
68b0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
68c0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
68d0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
68e0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
68f0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
6900: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
6910: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
6920: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
6930: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
6940: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
6950: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6960: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
6970: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
6980: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
6990: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
69a0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
69b0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
69c0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
69d0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
69e0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
69f0: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
6a00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6a10: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
6a20: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6a30: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6a40: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6a50: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6a60: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6a70: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6a80: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6a90: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6aa0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6ab0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6ac0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
6ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
6ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
6b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6b70: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6b80: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6b90: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6ba0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6bc0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
6bd0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
6be0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
6bf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6c00: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
6c10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6c20: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6c30: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6c40: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6c50: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6c60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6c70: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6c80: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6c90: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6ca0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6cb0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6cc0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
6cd0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
6ce0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
6cf0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
6d00: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
6d10: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
6d20: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6d30: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6d40: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6d50: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6d60: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6d70: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6d80: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6d90: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6da0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6db0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6dc0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
6dd0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
6de0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
6df0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
6e00: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
6e10: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6e20: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6e30: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6e40: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6e50: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6e60: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6e70: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6e80: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6e90: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6ea0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6eb0: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6ec0: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
6ed0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
6ee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6ef0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
6f00: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
6f10: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
6f20: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6f30: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6f40: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6f50: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6f60: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6f70: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6f80: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6f90: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6fa0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6fb0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6fc0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
6fd0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
6fe0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
6ff0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
7000: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
7010: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
7020: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
7030: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
7040: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7050: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7060: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7070: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7080: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7090: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
70a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
70b0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
70c0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
70d0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
70e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
70f0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7100: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7110: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7120: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7130: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7140: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7150: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7160: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7170: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7180: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7190: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
71a0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
71b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
71c0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
71d0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
71e0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
71f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7200: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7210: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7220: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7230: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7240: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7250: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
7260: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
7270: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
7280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7290: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
72a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
72b0: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50  OR_HINTS./*.** P
72c0: 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20  rovide hints to 
72d0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
72e0: 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74   particular hint
72f0: 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20   given (and the 
7300: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62  type.** and numb
7310: 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67  er of the vararg
7320: 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73  s parameters) is
7330: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
7340: 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20  he eHintType.** 
7350: 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20  parameter.  See 
7360: 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  the definitions 
7370: 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e  of the BTREE_HIN
7380: 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64  T_* macros for d
7390: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
73a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
73b0: 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20  orHint(BtCursor 
73c0: 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74  *pCur, int eHint
73d0: 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a  Type, ...){.  /*
73e0: 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79   Used only by sy
73f0: 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69  stem that substi
7400: 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73  tute their own s
7410: 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f  torage engine */
7420: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7430: 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69   Provide flag hi
7440: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7450: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7460: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7470: 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  tFlags(BtCursor 
7480: 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20  *pCur, unsigned 
7490: 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d  x){.  assert( x=
74a0: 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c  =BTREE_SEEK_EQ |
74b0: 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c  | x==BTREE_BULKL
74c0: 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20  OAD || x==0 );. 
74d0: 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78   pCur->hints = x
74e0: 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
74f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7500: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
7510: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
7520: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
7530: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
7540: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
7550: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
7560: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
7570: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7580: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
7590: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
75a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
75b0: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
75c0: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
75d0: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
75e0: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
75f0: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
7600: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
7610: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
7620: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
7630: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
7640: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
7650: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
7660: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
7670: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
7680: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
7690: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
76a0: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
76b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
76c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
76d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
76e0: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
76f0: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
7700: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
7710: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
7720: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
7730: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
7740: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
7750: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
7760: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
7770: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
7780: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
7790: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
77a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
77b0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
77c0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
77d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
77e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
77f0: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
7800: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
7810: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
7820: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
7830: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
7840: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
7850: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7860: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
7870: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
7880: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
7890: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
78a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
78b0: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
78c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
78d0: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
78e0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
78f0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
7900: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
7910: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
7920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
7930: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
7940: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
7950: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
7960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
7970: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7980: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
7990: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
79a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
79b0: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
79c0: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
79d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
79e0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
79f0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7a10: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7a20: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
7a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7a40: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
7a50: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
7a60: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
7a70: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
7a80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7a90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7aa0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7ab0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7ac0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7ad0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7ae0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7af0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7b00: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7b10: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7b20: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7b30: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7b40: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7b50: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
7b60: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
7b70: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
7b80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
7b90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
7ba0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
7bb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
7bc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
7bd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
7be0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
7bf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7c00: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
7c10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7c20: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7c30: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7c40: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7c50: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7c60: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c80: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7c90: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7ca0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7cb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
7cc0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
7cd0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
7ce0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7cf0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
7d00: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
7d10: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7d20: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7d30: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7d40: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7d50: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7d60: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7d70: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7d80: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7da0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
7db0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7dc0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
7dd0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
7de0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
7df0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7e00: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
7e10: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7e20: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7e30: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7e40: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7e50: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7e60: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7e70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7e80: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7e90: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7ea0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
7eb0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
7ec0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
7ed0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
7ee0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
7ef0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
7f00: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
7f10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7f20: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7f30: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7f40: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7f60: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7f70: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7f80: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7f90: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7fa0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
7fb0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7fc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
7fd0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7fe0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
7ff0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8000: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8010: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8020: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8030: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8040: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8050: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8060: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8070: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8080: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8090: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
80a0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
80b0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
80c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
80d0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
80e0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
80f0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8100: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8120: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8130: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8140: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8150: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8160: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8170: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8180: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8190: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
81a0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
81b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
81c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
81d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
81e0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
81f0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8200: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8210: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8220: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8230: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8240: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8250: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8260: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8270: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8280: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8290: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
82a0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
82b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
82c0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
82d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
82e0: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
82f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8300: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
8310: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
8320: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
8330: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
8340: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
8350: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8360: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
8370: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
8380: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
8390: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
83a0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
83b0: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
83c0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
83d0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
83e0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
83f0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8400: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8410: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8420: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
8430: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
8440: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
8450: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
8460: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
8470: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
8480: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
8490: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
84a0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
84b0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
84c0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
84d0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
84e0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
84f0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
8500: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
8510: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
8520: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8530: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8540: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8550: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
8560: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8570: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8580: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
8590: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
85a0: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
85b0: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
85c0: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
85d0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
85e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
85f0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8600: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
8610: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8620: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
8630: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
8640: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
8650: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
8660: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
8670: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
8680: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
8690: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
86a0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
86b0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
86c0: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
86d0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
86e0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
86f0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8720: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8730: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8740: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8750: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8760: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8770: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8780: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8790: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
87a0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
87b0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
87c0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
87d0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
87e0: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
87f0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8800: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8810: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8820: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
8830: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
8840: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
8850: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
8860: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
8870: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
8880: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
8890: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
88a0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
88b0: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
88c0: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
88d0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
88e0: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
88f0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8900: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8910: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8920: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
8930: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
8940: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
8950: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
8960: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
8970: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
8980: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
8990: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
89a0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
89b0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
89c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
89d0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
89e0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
89f0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
8a00: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
8a10: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
8a20: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
8a30: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8a40: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
8a50: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8a60: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
8a70: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
8a80: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
8a90: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
8aa0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
8ab0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8ac0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
8ad0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8ae0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8af0: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
8b00: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
8b10: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8b20: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
8b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8b40: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8b50: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8b60: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
8b70: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8b80: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8b90: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8ba0: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
8bb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
8bc0: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
8bd0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
8be0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
8bf0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
8c00: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8c10: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8c20: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8c30: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8c40: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8c50: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8c60: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8c70: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8c80: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8c90: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8ca0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
8cb0: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
8cc0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8cd0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
8ce0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
8cf0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
8d00: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8d10: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8d20: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8d30: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8d40: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8d50: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8d60: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8d70: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8d80: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8d90: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8da0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8db0: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
8dc0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8de0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8df0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8e00: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8e10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8e20: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8e30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8e40: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8e50: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8e60: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8e70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8e80: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8e90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8ea0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8eb0: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
8ec0: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
8ed0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
8ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
8ef0: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
8f00: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
8f10: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
8f20: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
8f30: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
8f40: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
8f50: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
8f60: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
8f70: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
8f80: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8f90: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
8fa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
8fb0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8fc0: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
8fd0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8fe0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8ff0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9000: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9010: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9020: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9030: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9040: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9050: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9060: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9070: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
9080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
9090: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
90a0: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
90b0: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
90c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
90d0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
90e0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
90f0: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
9100: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
9110: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
9120: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9130: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9140: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9160: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9170: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9190: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
91a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
91b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
91c0: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
91d0: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
91e0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
91f0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9200: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9210: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9220: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
9230: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
9240: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9250: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9260: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9270: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
9280: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9290: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
92a0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
92b0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
92c0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
92d0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
92e0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
92f0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9300: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9310: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
9320: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9330: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9340: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
9350: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
9360: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
9370: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
9380: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
9390: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
93a0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
93b0: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
93c0: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
93d0: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
93e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
93f0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
9400: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
9410: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
9420: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
9430: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
9440: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
9450: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
9460: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
9470: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9480: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
9490: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
94a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
94b0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
94c0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
94d0: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
94e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9500: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
9510: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
9520: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
9530: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
9540: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
9550: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
9560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9580: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9590: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
95a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
95b0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
95c0: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
95d0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
95e0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
95f0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
9600: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
9610: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
9620: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
9630: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
9640: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
9650: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
9660: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
9670: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
9680: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
9690: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
96a0: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
96b0: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
96d0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
96e0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
96f0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9700: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9710: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9720: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9730: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9740: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
9750: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9760: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9770: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9780: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97a0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
97b0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
97c0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
97d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
97e0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
97f0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
9800: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9810: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9820: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9830: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9840: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9850: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9860: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9870: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9880: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9890: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
98a0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
98b0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
98c0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
98d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
98e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
98f0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
9900: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9910: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
9920: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
9930: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9940: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9950: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9960: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9970: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9980: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9990: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
99a0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
99b0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
99c0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
99d0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
99e0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
99f0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9a00: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9a10: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9a20: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9a30: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9a40: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9a50: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9a60: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9a70: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9a80: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9a90: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9aa0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9ab0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9ac0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9ad0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9ae0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9af0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9b00: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9b10: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9b20: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9b30: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9b40: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9b50: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9b60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9b70: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9b80: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9b90: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9ba0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9bb0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9bc0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9bd0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9be0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9bf0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9c00: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9c10: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9c20: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
9c30: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9c40: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9c50: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9c60: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
9c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9c80: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
9c90: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
9ca0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9cc0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9cd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
9ce0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
9cf0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9d00: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9d10: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
9d20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
9d30: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
9d40: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
9d50: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
9d60: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
9d70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
9d80: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
9d90: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
9da0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
9db0: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
9dc0: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
9dd0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
9de0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
9df0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
9e00: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
9e10: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
9e20: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
9e30: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
9e40: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
9e50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
9e60: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
9e70: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
9e80: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
9e90: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
9ea0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
9eb0: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
9ec0: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
9ed0: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
9ee0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
9ef0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
9f00: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9f10: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
9f20: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
9f30: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
9f40: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
9f50: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
9f60: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
9f70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
9fa0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
9fb0: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9fe0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
9ff0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a000: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
a010: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
a020: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a030: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
a040: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
a050: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
a060: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
a070: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
a080: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
a090: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
a0a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
a0b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
a0c0: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
a0d0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
a0e0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
a0f0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
a100: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
a110: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
a120: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
a130: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
a140: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
a150: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
a160: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
a170: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a180: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
a190: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a1a0: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
a1b0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
a1c0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
a1d0: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
a1e0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a1f0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a200: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a210: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a220: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
a230: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
a240: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
a250: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
a260: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
a270: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
a280: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
a290: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
a2a0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
a2b0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
a2c0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
a2d0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
a2e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
a2f0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
a300: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a310: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
a320: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a330: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a340: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
a350: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a360: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
a370: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a380: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a390: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
a3a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a3b0: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
a3c0: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
a3d0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
a3e0: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
a3f0: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
a400: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
a410: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a420: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a430: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
a440: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
a450: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a460: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
a470: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a480: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a490: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a4a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a4b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
a4c0: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
a4d0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a4e0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a4f0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
a500: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
a510: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a520: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a530: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
a540: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
a550: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
a560: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
a570: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a580: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
a590: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a5a0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
a5b0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
a5c0: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
a5d0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a5e0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a5f0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a600: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a610: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
a620: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a630: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a640: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a660: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a670: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a680: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a690: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a6a0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a6b0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a6c0: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a6d0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a6e0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a6f0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a700: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a710: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a720: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a730: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a740: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a750: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a760: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a770: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a780: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
a790: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a7a0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
a7b0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
a7c0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a7d0: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
a7e0: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
a7f0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a800: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a810: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
a820: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
a830: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a840: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
a850: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a860: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a870: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
a880: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
a890: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
a8a0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
a8b0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
a8c0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
a8d0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
a8e0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
a8f0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
a900: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
a910: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
a920: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
a930: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
a940: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
a950: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
a960: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
a970: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
a980: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
a990: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
a9a0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
a9b0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
a9c0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
a9d0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
a9e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
a9f0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
aa00: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
aa10: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
aa20: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
aa30: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
aa40: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
aa50: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
aa60: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
aa70: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
aa80: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70   pCell!=0 );.  p
aa90: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
aaa0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
aab0: 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
aac0: 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
aad0: 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67  ayload ){.    Pg
aae0: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
aaf0: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  te(&pCell[info.n
ab00: 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74  Size-4]);.    pt
ab10: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
ab20: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
ab30: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
ab40: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
ab50: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
ab60: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
ab70: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
ab80: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
ab90: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
aba0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
abb0: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
abc0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
abd0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
abe0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
abf0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
ac00: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
ac10: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
ac20: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
ac30: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a  ontent area..**.
ac40: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
ac50: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
ac60: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
ac70: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
ac80: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
ac90: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
aca0: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
acb0: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
acc0: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
acd0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
ace0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
acf0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
ad00: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
ad10: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
ad20: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
ad30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ad40: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
ad50: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
ad60: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
ad70: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ada0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
add0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
ade0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
ae10: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ae20: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae40: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
ae50: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
ae60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
ae70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
ae80: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
ae90: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
aea0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
aeb0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
aec0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
aed0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
aee0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
aef0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af00: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
af10: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
af20: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
af30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af40: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
af50: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
af60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
af70: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
af80: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
af90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
afa0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
afb0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
afc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
afd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
aff0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b000: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b020: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b030: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b040: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b060: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b070: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
b080: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b090: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b0a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b0b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b0c0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b0d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b0e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b0f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b100: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b110: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b120: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b130: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b140: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b150: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b160: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b170: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b180: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b190: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
b1a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
b1b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
b1c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
b1d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b1e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
b1f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
b200: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
b210: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
b220: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
b230: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
b240: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
b250: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
b260: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
b270: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
b280: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
b290: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
b2a0: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
b2b0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
b2c0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
b2d0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
b2e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
b2f0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
b300: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
b310: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b320: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
b330: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b340: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
b350: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
b360: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b370: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
b380: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
b390: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
b3a0: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
b3b0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
b3c0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b3d0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b3e0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
b3f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b400: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b410: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
b420: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
b430: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
b440: 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43  size = pPage->xC
b450: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
b460: 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  src[pc]);.    cb
b470: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
b480: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
b490: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
b4a0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b4b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b4c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b4d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b4e0: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
b4f0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
b500: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b510: 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b    testcase( cbrk
b520: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b530: 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
b540: 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62  e( pc+size==usab
b550: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75  leSize );.    pu
b560: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
b570: 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d  rk);.    if( tem
b580: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  p==0 ){.      in
b590: 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t x;.      if( c
b5a0: 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e  brk==pc ) contin
b5b0: 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d  ue;.      temp =
b5c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
b5d0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
b5e0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
b5f0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
b600: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b610: 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70      memcpy(&temp
b620: 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28  [x], &data[x], (
b630: 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b  cbrk+size) - x);
b640: 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d  .      src = tem
b650: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  p;.    }.    mem
b660: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
b670: 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29   &src[pc], size)
b680: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b690: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b6a0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
b6b0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
b6c0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
b6d0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
b6e0: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
b6f0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
b700: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
b710: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
b720: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
b730: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b740: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b750: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b760: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
b770: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
b780: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
b790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b7a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
b7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
b7d0: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
b7e0: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
b7f0: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
b800: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
b810: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
b820: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
b830: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
b840: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
b850: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
b860: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
b870: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
b880: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
b890: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
b8a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
b8b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
b8c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b8d0: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
b8e0: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
b8f0: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
b900: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
b910: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
b920: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
b930: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
b940: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
b950: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
b960: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
b970: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
b980: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
b990: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
b9a0: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
b9b0: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
b9c0: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
b9d0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
b9e0: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
b9f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ba00: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
ba10: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
ba20: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
ba30: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
ba40: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
ba50: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
ba60: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
ba70: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
ba80: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
ba90: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
baa0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
bab0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
bac0: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
bad0: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
bae0: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
baf0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
bb00: 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29    assert( pc>0 )
bb10: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
bb20: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bb30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
bb40: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
bb50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bb60: 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46   R-06866-39125 F
bb70: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c  reeblocks are al
bb80: 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69  ways connected i
bb90: 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a  n order of.    *
bba0: 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66  * increasing off
bbb0: 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  set. */.    if( 
bbc0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
bbd0: 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b  || pc<iAddr+4 ){
bbe0: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
bbf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bc00: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
bc10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  0;.    }.    /* 
bc20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
bc30: 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74  2710-53328 The t
bc40: 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20  hird and fourth 
bc50: 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20  bytes of each.  
bc60: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66    ** freeblock f
bc70: 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e  orm a big-endian
bc80: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
bc90: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
bca0: 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20  e freeblock.    
bcb0: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63  ** in bytes, inc
bcc0: 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74  luding the 4-byt
bcd0: 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
bce0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
bcf0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  (&aData[pc+2]);.
bd00: 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a      if( (x = siz
bd10: 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b  e - nByte)>=0 ){
bd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bd30: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
bd40: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
bd50: 0a 20 20 20 20 20 20 69 66 28 20 70 63 20 3c 20  .      if( pc < 
bd60: 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  pPg->cellOffset+
bd70: 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  2*pPg->nCell || 
bd80: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
bd90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
bda0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
bdb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bdc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bdd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c      }else if( x<
bde0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
bdf0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
be00: 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20  1498-58022 In a 
be10: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
be20: 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74  ee page, the tot
be30: 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  al.        ** nu
be40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
be50: 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e   fragments may n
be60: 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f  ot exceed 60. */
be70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61  .        if( aDa
be80: 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72  ta[hdr+7]>57 ) r
be90: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20  eturn 0;..      
bea0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
beb0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
bec0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
bed0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
bee0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
bef0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
bf00: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
bf10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
bf20: 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61  ata[iAddr], &aDa
bf30: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
bf40: 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d      aData[hdr+7]
bf50: 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20   += (u8)x;.     
bf60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bf70: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
bf80: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
bf90: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
bfa0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
bfb0: 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  .         ** for
bfc0: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
bfd0: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
bfe0: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
bff0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44      put2byte(&aD
c000: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
c010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
c020: 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20  urn &aData[pc + 
c030: 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41  x];.    }.    iA
c040: 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63  ddr = pc;.    pc
c050: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
c060: 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c  ta[pc]);.  }whil
c070: 65 28 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75  e( pc );..  retu
c080: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
c090: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
c0a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
c0b0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
c0c0: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
c0d0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
c0e0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
c0f0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
c100: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
c110: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
c120: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c130: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
c140: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
c150: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
c160: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
c170: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
c180: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
c190: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
c1a0: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
c1b0: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
c1c0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
c1d0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
c1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
c1f0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
c200: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
c210: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
c220: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
c230: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
c240: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
c250: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
c260: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
c270: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
c280: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
c290: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
c2a0: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
c2b0: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
c2c0: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
c2d0: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
c2e0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
c2f0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
c300: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
c310: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
c320: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
c330: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c340: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
c350: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
c360: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
c370: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
c380: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c390: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c3a0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
c3b0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c3c0: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
c3d0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
c3e0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
c3f0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c420: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
c430: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
c440: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
c470: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
c480: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
c490: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
c4a0: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
c4b0: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
c4c0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
c4d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c4e0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c4f0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c510: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
c520: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c530: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c540: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c550: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
c560: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
c570: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
c580: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c590: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
c5a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c5b0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
c5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c5d0: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
c5e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c5f0: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
c600: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
c610: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
c620: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
c630: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
c640: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
c650: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
c660: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
c670: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
c680: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
c690: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
c6a0: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
c6b0: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
c6c0: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
c6d0: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
c6e0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
c6f0: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
c700: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
c710: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
c720: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
c730: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
c740: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
c750: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
c760: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
c770: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
c780: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
c790: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
c7a0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
c7b0: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
c7c0: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
c7d0: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
c7e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c7f0: 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  5]);.  assert( t
c800: 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e  op<=(int)pPage->
c810: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c820: 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79  ); /* Prevent by
c830: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
c840: 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74  ) */.  if( gap>t
c850: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
c860: 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70  p==0 && pPage->p
c870: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d  Bt->usableSize==
c880: 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74  65536 ){.      t
c890: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
c8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
c8b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c8c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
c8d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
c8e0: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
c8f0: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
c900: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
c910: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
c920: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
c930: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
c940: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
c950: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
c960: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
c970: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
c980: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
c990: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
c9a0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
c9b0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
c9c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
c9d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
c9e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
c9f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
ca00: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
ca10: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
ca20: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
ca30: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
ca40: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
ca50: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
ca60: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
ca70: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
ca80: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
ca90: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
caa0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
cab0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
cac0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
cad0: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
cae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
caf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
cb00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cb10: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
cb20: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
cb30: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
cb40: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
cb50: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
cb60: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
cb70: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
cb80: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
cb90: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
cba0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
cbb0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
cbc0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
cbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
cbe0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
cbf0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
cc00: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
cc10: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
cc20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cc30: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
cc40: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
cc50: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
cc60: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
cc70: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
cc80: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
cc90: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
cca0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ccb0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
ccc0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
ccd0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
cce0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
ccf0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
cd00: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
cd10: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
cd20: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
cd30: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
cd40: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
cd50: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
cd60: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
cd70: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
cd80: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
cd90: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
cda0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
cdb0: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
cdc0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
cdd0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
cde0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
cdf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
ce00: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
ce10: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
ce20: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ce30: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
ce40: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
ce50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ce60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ce70: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
ce80: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
ce90: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
cea0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
ceb0: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
cec0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
ced0: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
cee0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
cef0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
cf00: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
cf10: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
cf20: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
cf30: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
cf40: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
cf50: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
cf60: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
cf70: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cf80: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
cf90: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
cfa0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
cfb0: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
cfc0: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
cfd0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
cfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
cff0: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
d000: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
d010: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
d020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d030: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
d040: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
d050: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
d060: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
d070: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d080: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
d090: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
d0a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d0b0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
d0c0: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
d0d0: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
d0e0: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
d110: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
d120: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
d130: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
d140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d160: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
d170: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
d180: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
d1b0: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
d1c0: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
d1d0: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
d200: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
d210: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
d220: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
d230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
d240: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
d250: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
d260: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
d270: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
d280: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
d290: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
d2a0: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
d2b0: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
d2c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
d2d0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
d2e0: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
d2f0: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
d300: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
d310: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
d320: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
d330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
d340: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d360: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
d370: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d390: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
d3a0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
d3b0: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
d3c0: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
d3d0: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
d3e0: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
d3f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d400: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
d410: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d420: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d430: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d440: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
d450: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
d460: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
d470: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
d480: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
d490: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
d4a0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
d4b0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
d4c0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
d4d0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
d4e0: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
d4f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
d500: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
d510: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
d520: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
d530: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
d540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
d550: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
d560: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
d570: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
d580: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
d590: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
d5a0: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
d5b0: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
d5c0: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
d5d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
d5e0: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
d5f0: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
d600: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
d610: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
d620: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
d630: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
d640: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
d650: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
d660: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
d670: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
d680: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
d690: 61 74 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26  ata[iPtr]))>0 &&
d6a0: 20 69 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74   iFreeBlk<iStart
d6b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
d6c0: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20  reeBlk<iPtr+4 ) 
d6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d6e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d6f0: 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c    iPtr = iFreeBl
d700: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
d710: 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20   iFreeBlk>iLast 
d720: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d730: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d740: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
d750: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
d760: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
d770: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
d780: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
d790: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
d7a0: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
d7b0: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
d7c0: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
d7d0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
d7e0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
d7f0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
d800: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
d810: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
d820: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
d830: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
d840: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
d850: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
d860: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
d870: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
d880: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
d890: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
d8a0: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
d8b0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
d8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d8d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
d8e0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
d8f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d900: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
d910: 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70      if( iEnd > p
d920: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
d930: 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53  eSize ) return S
d940: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d950: 50 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20  PT;.      iSize 
d960: 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b  = iEnd - iStart;
d970: 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20  .      iFreeBlk 
d980: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d990: 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20  [iFreeBlk]);.   
d9a0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
d9b0: 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20  iPtr is another 
d9c0: 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20  freeblock (that 
d9d0: 69 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e  is, if iPtr is n
d9e0: 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  ot the freelist.
d9f0: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69      ** pointer i
da00: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
da10: 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  r) then check to
da20: 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73   see if iStart s
da30: 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
da40: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
da50: 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a  he end of iPtr..
da60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
da70: 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20  Ptr>hdr+1 ){.   
da80: 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d     int iPtrEnd =
da90: 20 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65   iPtr + get2byte
daa0: 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b  (&data[iPtr+2]);
dab0: 0a 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45  .      if( iPtrE
dac0: 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a  nd+3>=iStart ){.
dad0: 20 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72          if( iPtr
dae0: 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74  End>iStart ) ret
daf0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
db00: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
db10: 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74   nFrag += iStart
db20: 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20   - iPtrEnd;.    
db30: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
db40: 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20   - iPtr;.       
db50: 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a   iStart = iPtr;.
db60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
db70: 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61    if( nFrag>data
db80: 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e  [hdr+7] ) return
db90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
dba0: 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68  BKPT;.    data[h
dbb0: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
dbc0: 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74    }.  if( iStart
dbd0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
dbe0: 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20  [hdr+5]) ){.    
dbf0: 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62  /* The new freeb
dc00: 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62  lock is at the b
dc10: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
dc20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
dc30: 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73  a,.    ** so jus
dc40: 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c  t extend the cel
dc50: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72  l content area r
dc60: 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74  ather than creat
dc70: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  e another.    **
dc80: 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20   freelist entry 
dc90: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21  */.    if( iPtr!
dca0: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
dcb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dcc0: 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74  KPT;.    put2byt
dcd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  e(&data[hdr+1], 
dce0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
dcf0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
dd00: 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d  r+5], iEnd);.  }
dd10: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73  else{.    /* Ins
dd20: 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65  ert the new free
dd30: 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66  block into the f
dd40: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70  reelist */.    p
dd50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  ut2byte(&data[iP
dd60: 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  tr], iStart);.  
dd70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
dd80: 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42  [iStart], iFreeB
dd90: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
dda0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
ddb0: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ], iSize);.  }. 
ddc0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
ddd0: 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ddf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
de00: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
de10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
de20: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
de30: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
de40: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
de50: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
de60: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
de70: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
de80: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
de90: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
dea0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
deb0: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
dec0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
ded0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
dee0: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
def0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
df00: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
df10: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
df20: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
df30: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
df40: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
df50: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
df60: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
df70: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
df80: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
df90: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
dfa0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
dfb0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
dfc0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
dfd0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
dfe0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dff0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
e000: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
e010: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
e020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e030: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
e040: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
e050: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
e060: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
e070: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
e080: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
e090: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
e0a0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
e0b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
e0c0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
e0d0: 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
e0e0: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e0f0: 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
e100: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
e110: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
e120: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
e130: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
e140: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
e150: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
e160: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
e170: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
e180: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
e190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
e1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
e1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
e1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e1e0: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
e1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
e200: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e210: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
e220: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
e230: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e240: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
e250: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
e260: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
e270: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
e280: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
e290: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
e2a0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
e2b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
e2c0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
e2d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
e2e0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
e2f0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e300: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  yLeaf = 0;.     
e310: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
e320: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  e = cellSizePtrN
e330: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20  oPayload;.      
e340: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e350: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e360: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  llPtrNoPayload;.
e370: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
e380: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
e390: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
e3a0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e3b0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
e3c0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
e3d0: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
e3e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
e3f0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d  NCE-OF: R-27225-
e400: 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66  53936 A value of
e410: 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   2 means the pag
e420: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
e430: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d  .    ** index b-
e440: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e450: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
e460: 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
e470: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e480: 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35  F: R-16571-11615
e490: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d   A value of 10 m
e4a0: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e4b0: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69   a leaf.    ** i
e4c0: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
e4d0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e4e0: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
e4f0: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
e500: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e510: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
e520: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
e530: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
e540: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e550: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
e560: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
e570: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
e580: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
e590: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e5a0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
e5b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
e5c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
e5d0: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
e5e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
e5f0: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
e600: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
e610: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
e620: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e630: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
e640: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
e650: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
e660: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
e670: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e680: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
e690: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
e6a0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
e6b0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
e6c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
e6d0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e6e0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
e6f0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
e700: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
e710: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
e720: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
e730: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
e740: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
e750: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
e760: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
e770: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
e780: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
e790: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
e7a0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
e7b0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
e7c0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
e7d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
e7e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
e7f0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
e800: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
e810: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
e820: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e830: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
e840: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e860: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e870: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e880: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
e890: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
e8a0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
e8b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e8c0: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
e8d0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e8e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e8f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e900: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
e910: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e920: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e930: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
e940: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
e950: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
e960: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e970: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
e980: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
e990: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
e9a0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
e9b0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
e9c0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
e9d0: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
e9e0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
e9f0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
ea00: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
ea10: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
ea20: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
ea30: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
ea40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
ea50: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
ea60: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
ea70: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
ea80: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
ea90: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
eaa0: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
eab0: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
eac0: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
ead0: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
eae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eaf0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
eb00: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
eb10: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
eb30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
eb40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
eb50: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
eb60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
eb70: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
eb80: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
eb90: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
eba0: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
ebb0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
ebc0: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
ebd0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
ebe0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
ebf0: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
ec00: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ec10: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
ec20: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
ec30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec40: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
ec50: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
ec60: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
ec70: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
ec80: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
ec90: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
eca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
ecb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
ecc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ecd0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
ece0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
ecf0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
ed00: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
ed10: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
ed20: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
ed30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ed40: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
ed50: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
ed60: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
ed70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
ed80: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
ed90: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
eda0: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
edb0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
edc0: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
edd0: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
ede0: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
edf0: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
ee00: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
ee10: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
ee20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
ee30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
ee40: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
ee50: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
ee60: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
ee70: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
ee80: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
ee90: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
eea0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
eeb0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
eec0: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
eed0: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
eee0: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
eef0: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ef00: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
ef10: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
ef20: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
ef30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ef40: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
ef50: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ef60: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
ef70: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
ef80: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
ef90: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
efa0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
efb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
efc0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
efd0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
efe0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
eff0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
f000: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
f010: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
f020: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
f030: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
f040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f050: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f060: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
f070: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
f080: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
f090: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f0a0: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
f0b0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
f0c0: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
f0d0: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
f0e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
f0f0: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
f100: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
f110: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
f120: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
f130: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
f140: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
f150: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
f160: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
f170: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
f180: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
f190: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f1a0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
f1b0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
f1c0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
f1d0: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
f1e0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
f1f0: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
f200: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
f210: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
f220: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
f230: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
f240: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f250: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
f260: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
f270: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
f280: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
f290: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
f2a0: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
f2b0: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
f2c0: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
f2d0: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
f2e0: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
f2f0: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
f300: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
f310: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
f320: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
f330: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
f340: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
f350: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f360: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
f370: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f390: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
f3a0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
f3b0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
f3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f3d0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
f3e0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
f3f0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
f400: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
f410: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
f420: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f430: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
f440: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
f450: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
f460: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f470: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
f480: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f490: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
f4a0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f4b0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f4c0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f4e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f4f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f500: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
f510: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f520: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
f530: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
f540: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
f550: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
f560: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
f570: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
f580: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f5a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
f5c0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
f5d0: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
f5e0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
f5f0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
f600: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
f610: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
f620: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
f630: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
f640: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f650: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
f660: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
f670: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
f680: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
f690: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
f6a0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
f6b0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
f6c0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
f6d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
f6e0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
f6f0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
f700: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
f710: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
f720: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
f730: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
f740: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
f750: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f760: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f770: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f780: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
f790: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
f7a0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
f7b0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
f7c0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
f7d0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
f7e0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
f7f0: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
f800: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
f810: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
f820: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
f830: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
f840: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
f850: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
f860: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f870: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f880: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
f890: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
f8a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
f8b0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
f8c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
f8d0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
f8e0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
f8f0: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
f900: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
f910: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
f920: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
f930: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
f940: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
f950: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
f960: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
f970: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
f980: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f990: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
f9a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f9b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
f9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
f9d0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
f9e0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
f9f0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
fa00: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
fa10: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
fa20: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
fa30: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
fa40: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
fa50: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
fa60: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
fa70: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
fa80: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
fa90: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
faa0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
fab0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
fac0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
fad0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
fae0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
faf0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
fb00: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
fb10: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
fb20: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
fb30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
fb40: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
fb50: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
fb60: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
fb70: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
fb80: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
fb90: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
fba0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
fbb0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
fbc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fbd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fbe0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
fbf0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
fc00: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
fc10: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
fc20: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
fc30: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
fc40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
fc50: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
fc60: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
fc70: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
fc80: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
fc90: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
fca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
fcb0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
fcc0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
fcd0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
fce0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
fcf0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
fd00: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
fd10: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
fd20: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fd30: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
fd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fd50: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
fd60: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
fd70: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
fd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fd90: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
fda0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fdb0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
fdc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
fde0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
fdf0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
fe00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
fe10: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
fe20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fe30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fe40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fe50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
fe60: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
fe70: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
fe80: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
fe90: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
fea0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
feb0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
fec0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
fed0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
fee0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
fef0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
ff00: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
ff10: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
ff20: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
ff30: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
ff40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ff50: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
ff60: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ff70: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
ff80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
ff90: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
ffa0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
ffb0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
ffc0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
ffd0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
ffe0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
fff0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
10000 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
10010 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
10020 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
10030 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
10040 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
10050 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
10060 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
10070 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
10080 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
10090 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
100a0 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
100b0 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
100c0 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
100d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
100e0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
100f0 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
10100 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
10110 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
10120 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
10130 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
10140 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
10150 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
10160 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
10170 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
10180 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
10190 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
101a0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
101b0 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
101c0 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
101d0 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
101e0 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
101f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
10200 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
10210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10220 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
10230 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
10240 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
10250 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
10260 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
10270 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
10280 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10290 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
102a0 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
102b0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
102c0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
102d0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
102e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
102f0 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
10300 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
10310 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
10320 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
10330 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
10340 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
10350 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
10360 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
10370 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
10380 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
10390 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
103a0 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
103b0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
103c0 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
103d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
103e0 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
103f0 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
10400 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
10410 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
10420 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
10430 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
10440 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
10450 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
10460 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
10470 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
10480 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
10490 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
104a0 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
104b0 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
104c0 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
104d0 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
104e0 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
104f0 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
10500 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
10510 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
10520 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
10540 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
10550 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
10560 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
10570 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
10580 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
10590 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
105a0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
105b0 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
105c0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
105d0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
105e0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
105f0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
10600 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
10610 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
10620 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
10630 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
10640 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
10650 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
10660 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
10670 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
10680 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10690 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
106a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
106b0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
106c0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
106d0 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
106e0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
106f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
10700 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10710 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10720 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10730 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
10740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10750 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
10760 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10770 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
10780 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10790 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
107a0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
107b0 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
107c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
107d0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
107e0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
107f0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10800 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
10810 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
10820 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
10830 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
10840 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10850 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10870 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10880 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
10890 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
108a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
108b0 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
108c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
108d0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
108e0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
108f0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
10900 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10910 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10920 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10930 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10940 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10950 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
10960 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
10970 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
10980 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
10990 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
109a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
109b0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
109c0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
109d0 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
109e0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
109f0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
10a00 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10a10 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10a20 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10a30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10a40 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10a50 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
10a60 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10a70 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
10a80 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
10a90 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
10aa0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
10ab0 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
10ac0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
10ad0 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
10ae0 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
10af0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
10b00 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
10b10 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
10b20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
10b30 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
10b40 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
10b50 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
10b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10b70 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
10b80 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
10b90 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
10ba0 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
10bb0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
10bc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10bd0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
10be0 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
10bf0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
10c00 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
10c10 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
10c20 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
10c30 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
10c40 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
10c50 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10c60 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
10c70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
10c80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
10c90 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
10cc0 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
10cd0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
10ce0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
10cf0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
10d00 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
10d10 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10d20 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
10d30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10d40 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
10d50 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
10d60 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10d90 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
10da0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
10db0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
10dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10dd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10de0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10df0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
10e00 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
10e10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
10e20 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
10e30 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
10e40 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
10e50 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
10e60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10e70 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
10e80 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
10e90 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
10ea0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
10eb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10ec0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
10ed0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
10ee0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
10ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10f00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
10f10 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
10f20 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
10f30 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
10f40 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
10f50 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
10f60 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
10f70 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10f80 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
10f90 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
10fa0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
10fb0 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
10fc0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10fd0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10fe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
10ff0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
11000 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
11010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11030 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
11040 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11050 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
11060 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
11070 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
11080 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
11090 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
110a0 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
110b0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
110c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
110d0 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
110e0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
110f0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
11100 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
11110 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
11120 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
11130 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
11140 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
11150 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
11160 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
11170 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
11180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11190 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
111a0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
111b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
111c0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
111d0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
111e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
111f0 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
11200 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20  ge_error:.  if( 
11210 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61  pCur ) pCur->iPa
11220 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65  ge--;.  testcase
11230 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
11240 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
11250 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
11260 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
11270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11280 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
11290 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
112a0 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
112b0 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
112c0 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
112d0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
112e0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e  oid releasePageN
112f0 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  otNull(MemPage *
11300 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
11310 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
11320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11330 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
11340 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
11350 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
11360 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11370 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11380 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11390 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
113a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
113b0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
113c0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
113d0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
113e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
113f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
11410 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
11420 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
11430 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69  DbPage);.}.stati
11440 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11450 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11460 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
11470 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  ) releasePageNot
11480 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  Null(pPage);.}..
11490 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75  /*.** Get an unu
114a0 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  sed page..**.** 
114b0 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
114c0 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67  like btreeGetPag
114d0 65 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64  e() with the add
114e0 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ition:.**.**   *
114f0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
11500 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20   already in use 
11510 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
11520 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74  urpose, immediat
11530 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65  ely.**      rele
11540 61 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72  ase it and retur
11550 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52  n an SQLITE_CURR
11560 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20  UPT error..**   
11570 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  *  Make sure the
11580 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20   isInit flag is 
11590 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20  clear.*/.static 
115a0 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73  int btreeGetUnus
115b0 65 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  edPage(.  BtShar
115c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
115d0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
115e0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
115f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11600 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
11610 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
11620 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
11630 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
11640 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
11650 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
11660 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11670 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
11680 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
11690 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
116a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65  .  int rc = btre
116b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
116c0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
116d0 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
116e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
116f0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
11700 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
11710 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
11720 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
11730 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11740 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
11750 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
11760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11770 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
11780 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
11790 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
117a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
117b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
117c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  ;.}.../*.** Duri
117d0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
117e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
117f0 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
11800 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
11810 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
11820 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
11830 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
11840 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
11850 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
11860 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
11870 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
11880 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
11890 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
118a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
118b0 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
118c0 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
118d0 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
118e0 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
118f0 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
11900 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
11910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
11920 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
11930 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
11940 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
11950 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
11960 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11970 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
11980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11990 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
119a0 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
119b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
119c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
119d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
119e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
119f0 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
11a00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
11a10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
11a20 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
11a30 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
11a40 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
11a50 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
11a60 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
11a70 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
11a80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
11a90 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
11aa0 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
11ab0 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
11ac0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
11ad0 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
11ae0 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
11af0 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
11b00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
11b10 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
11b20 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
11b30 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
11b40 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
11b50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
11b60 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
11b70 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
11b80 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
11b90 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
11ba0 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
11bb0 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
11bc0 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
11bd0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
11be0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
11bf0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
11c00 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
11c10 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
11c20 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
11c40 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11c50 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
11c60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11c70 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
11c80 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11c90 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
11ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11cb0 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
11cc0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
11cd0 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11ce0 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
11cf0 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
11d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
11d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
11d20 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
11d30 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11d50 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
11d60 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
11d70 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
11d80 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
11d90 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
11da0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
11db0 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
11dc0 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
11dd0 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
11de0 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
11df0 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
11e00 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
11e10 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
11e20 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
11e30 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
11e40 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
11e50 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
11e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
11e70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
11e80 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
11e90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
11ea0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
11eb0 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
11ec0 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
11ed0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
11ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
11ef0 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
11f00 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
11f10 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
11f20 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
11f30 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
11f40 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
11f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
11f60 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
11f70 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
11f80 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
11f90 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
11fa0 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
11fb0 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
11fc0 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
11fd0 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
11fe0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11ff0 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
12000 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
12010 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
12020 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
12030 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
12040 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
12050 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
12060 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
12070 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
12080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12090 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
120a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
120b0 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
120c0 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
120d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
120e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
120f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12100 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
12110 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
12120 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12130 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
12140 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
12150 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12160 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
12170 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
12180 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
12190 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
121a0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
121b0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
121c0 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
121d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
121e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
121f0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
12200 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
12210 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
12220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12240 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
12250 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
12260 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
12290 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
122a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
122b0 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
122c0 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
122d0 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
122e0 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
122f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12300 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12310 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
12320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
12330 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
12360 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
12370 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
12380 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
12390 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
123a0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
123b0 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
123c0 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
123d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
123e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
123f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
12400 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
12410 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
12420 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
12430 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
12440 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
12450 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
12460 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
12470 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
12480 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
12490 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
124a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124b0 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
124c0 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
124d0 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
124e0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
124f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
12500 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
12510 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
12540 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
12550 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
12580 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12590 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
125a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
125b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
125c0 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
125d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
125e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
125f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12600 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
12610 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
12620 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
12630 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
12640 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
12650 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
12660 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
12670 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
12680 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
12690 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
126a0 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
126b0 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
126c0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
126d0 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
126e0 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
126f0 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
12700 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
12710 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
12720 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
12730 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
12740 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
12750 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
12760 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
12770 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12780 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
12790 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
127a0 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
127b0 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
127c0 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
127d0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
127e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
127f0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
12800 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
12810 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
12820 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
12830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12840 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
12850 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
12860 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
12870 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
12880 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12890 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
128a0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
128b0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
128c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
128d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
128e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
128f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
12900 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
12910 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
12920 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
12930 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
12940 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
12950 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
12960 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
12970 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
12980 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
12990 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
129a0 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
129b0 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
129c0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
129d0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
129e0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
129f0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
12a00 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
12a10 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
12a20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
12a30 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
12a40 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
12a50 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
12a60 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
12a70 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
12a80 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
12a90 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
12aa0 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
12ab0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
12ac0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
12ad0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
12ae0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
12af0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
12b00 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
12b10 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
12b20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12b30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12b40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b60 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12b70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
12b80 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
12b90 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
12ba0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
12bb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12bc0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12bd0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12be0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
12c10 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
12c20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
12c30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
12c40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12c50 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12c70 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12c80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ca0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
12cb0 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
12cc0 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
12cd0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12ce0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12cf0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
12d00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12d10 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12d20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
12d30 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12d40 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12d50 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
12d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12d70 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
12d80 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
12d90 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
12da0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
12db0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
12dc0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
12dd0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
12de0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
12df0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
12e00 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12e10 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
12e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
12e30 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
12e40 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
12e50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
12e60 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
12e70 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
12e80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
12e90 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
12ea0 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
12eb0 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
12ed0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
12ee0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
12ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12f00 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
12f10 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
12f20 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
12f30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f40 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
12f50 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
12f60 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f70 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
12f80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
12f90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12fa0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12fc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12fe0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
12ff0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
13000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13010 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
13020 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
13030 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
13040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13060 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13070 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13080 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
130a0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
130b0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
130c0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
130d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
130e0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
130f0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
13100 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
13110 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
13120 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
13130 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
13140 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
13150 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
13160 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
13170 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
13180 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
13190 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
131a0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
131b0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
131c0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
131d0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
131e0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
131f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
13200 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
13210 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
13220 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13230 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
13240 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
13250 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
13260 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
13270 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
13280 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
13290 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
132a0 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
132b0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
132c0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
132d0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
132e0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
132f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
13300 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13310 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
13320 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13330 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
13340 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
13350 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
13360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13370 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
13380 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
13390 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
133a0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
133b0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
133c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
133d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
133e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
133f0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13400 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13410 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
13420 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
13430 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
13460 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
13470 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
13480 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
134a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
134b0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
134c0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
134d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
134e0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
134f0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
13500 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
13510 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
13520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13540 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
13550 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13560 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
13570 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
13580 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
13590 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
135a0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
135b0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
135c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
135d0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
135e0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
135f0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
13600 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
13610 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
13620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
13630 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
13640 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
13650 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13660 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
13670 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
13680 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
13690 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
136a0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
136b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
136c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
136d0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
136e0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
136f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
13700 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
13710 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
13720 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
13730 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
13740 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
13750 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
13760 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
13770 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
13780 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
13790 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
137a0 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
137b0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
137c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
137d0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
137e0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
137f0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
13800 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
13810 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
13820 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
13830 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13840 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
13850 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13860 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
13870 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
13880 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
13890 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
138a0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
138b0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
138c0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
138d0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
138e0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
138f0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
13900 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
13910 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
13920 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
13930 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
13940 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
13950 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
13960 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
13970 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
13980 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
13990 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
139a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
139b0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
139c0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
139d0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
139e0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
139f0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
13a00 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
13a10 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
13a20 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
13a30 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
13a40 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
13a50 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
13a60 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
13a70 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
13a80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13a90 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
13aa0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
13ab0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
13ac0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
13ad0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
13ae0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
13af0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
13b00 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
13b10 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
13b20 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
13b30 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
13b40 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
13b50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13b60 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
13b70 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
13b80 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
13b90 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13ba0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
13bb0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
13bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13bd0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
13be0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13bf0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
13c00 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
13c10 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
13c20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
13c30 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13c40 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
13c50 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
13c60 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
13c70 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13c80 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13c90 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13ca0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
13cb0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
13cc0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13cd0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
13ce0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
13cf0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
13d00 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
13d10 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
13d20 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
13d30 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
13d40 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
13d50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13d60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13d70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13d90 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
13da0 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
13db0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
13dc0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
13dd0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
13de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
13df0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
13e00 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13e10 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13e20 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
13e30 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
13e40 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13e50 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
13e60 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13e70 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13e80 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
13e90 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
13ea0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
13eb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13ec0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
13ed0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
13ee0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
13ef0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13f00 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
13f10 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
13f20 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
13f30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13f40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13f50 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
13f60 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13f80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13f90 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
13fa0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
13fb0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
13fc0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
13fd0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
13fe0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
13ff0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14000 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14010 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
14020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14030 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14040 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14050 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
14060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14070 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14080 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14090 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
140a0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
140b0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
140c0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
140d0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
140e0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
140f0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
14100 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
14110 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
14120 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
14130 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
14140 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
14150 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
14160 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
14170 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
14180 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
14190 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
141a0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
141b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
141c0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
141d0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
141e0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
141f0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
14200 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
14210 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
14220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14230 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
14240 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
14250 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
14260 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
14270 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
14280 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
14290 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
142a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
142b0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
142c0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
142d0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
142e0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
142f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14310 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
14320 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14330 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14340 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14350 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14360 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14370 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14390 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
143a0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
143b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
143c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
143d0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
143e0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
143f0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
14400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14410 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
14420 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14430 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14440 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
14450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14460 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14470 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14480 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14490 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
144a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
144b0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
144c0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
144d0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
144e0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
144f0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
14500 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
14510 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
14520 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
14530 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
14540 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
14550 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
14560 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
14570 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14580 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
14590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
145a0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
145b0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
145c0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
145d0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
145e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
145f0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
14600 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14610 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
14620 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
14630 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14640 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
14670 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
14680 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
14690 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
146a0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
146b0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
146c0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
146d0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
146e0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
146f0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
14700 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
14710 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
14720 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
14730 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
14740 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
14750 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
14760 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
14770 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
14780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14790 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
147a0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
147b0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
147c0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
147d0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
147e0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
147f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14800 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
14810 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
14820 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
14830 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14840 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14850 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
14860 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
14870 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
14880 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
14890 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
148a0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
148b0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
148c0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
148d0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
148e0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
148f0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14900 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
14910 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
14920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14930 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
14940 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14950 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
14960 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
14970 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
14980 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
14990 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
149a0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
149b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
149c0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
149d0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
149e0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
149f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
14a00 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
14a10 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
14a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14a30 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
14a40 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
14a50 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
14a60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14a70 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
14a80 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
14a90 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
14aa0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
14ab0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14ac0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
14ad0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
14ae0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
14af0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
14b00 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
14b10 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
14b20 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
14b30 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
14b40 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
14b50 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
14b60 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
14b70 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14b80 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
14b90 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
14ba0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
14bb0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
14bc0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
14bd0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
14be0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
14bf0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
14c00 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
14c10 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
14c20 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
14c30 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
14c40 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
14c50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
14c60 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
14c70 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
14c80 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
14c90 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
14ca0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
14cb0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
14cc0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
14cd0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
14ce0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
14cf0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
14d00 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
14d10 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
14d20 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
14d30 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
14d40 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
14d50 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
14d60 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
14d70 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
14d80 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
14d90 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
14da0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
14db0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
14dc0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
14dd0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
14de0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
14df0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
14e00 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
14e10 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
14e20 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
14e30 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
14e40 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
14e50 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
14e60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
14e70 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
14e80 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
14e90 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
14ea0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
14eb0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
14ec0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
14ed0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
14ee0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
14ef0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
14f00 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
14f10 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
14f20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
14f30 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
14f40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
14f50 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
14f60 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
14f70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
14f80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14f90 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
14fa0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
14fb0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
14fc0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
14fd0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
14fe0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
14ff0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
15000 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
15010 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
15020 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
15030 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
15040 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
15050 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
15060 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
15070 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
15080 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
15090 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
150a0 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
150b0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
150c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
150d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
150e0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
150f0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
15100 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
15110 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
15120 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15130 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15140 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15150 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
15160 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
15170 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
15180 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
15190 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
151a0 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
151b0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
151c0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
151d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
151e0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
151f0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
15200 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
15210 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
15220 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
15230 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
15240 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
15250 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
15260 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
15270 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
15280 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
15290 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
152a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
152b0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
152c0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
152d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
152e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
152f0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
15300 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
15310 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
15320 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
15330 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
15340 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
15350 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
15360 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
15370 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
15380 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
15390 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
153a0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
153b0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
153c0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
153d0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
153e0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
153f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
15400 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
15410 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
15420 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
15430 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
15440 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
15450 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
15460 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
15470 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
15480 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
15490 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
154a0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
154b0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
154c0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
154d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
154e0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
154f0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
15500 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
15510 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
15520 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
15530 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15540 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
15550 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
15560 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
15570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15580 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
15590 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
155a0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
155b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
155c0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
155d0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
155e0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
155f0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
15600 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
15610 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
15620 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
15630 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
15640 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
15650 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
15660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15680 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
15690 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
156a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
156b0 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
156c0 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
156d0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
156e0 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
156f0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
15700 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
15710 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
15720 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
15730 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
15740 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
15750 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
15760 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
15770 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
15780 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
15790 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
157a0 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
157b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
157c0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
157d0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
157e0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
157f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15800 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15810 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15820 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15830 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15840 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
15850 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
15860 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15870 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15880 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
158a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
158b0 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
158c0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
158d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
158e0 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
158f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
15900 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
15910 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
15920 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
15930 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
15940 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
15950 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
15960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
15970 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
15980 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
15990 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
159a0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
159b0 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
159c0 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
159d0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
159e0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
159f0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
15a00 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
15a10 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
15a20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
15a30 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
15a40 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
15a50 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
15a60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15a70 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
15a80 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
15a90 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15aa0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15ab0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
15ac0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15ad0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15ae0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15af0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15b00 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
15b10 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
15b20 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15b30 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15b40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15b50 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
15b60 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
15b70 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
15b80 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
15b90 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
15ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15bb0 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
15bc0 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
15bd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15be0 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
15bf0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
15c00 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
15c10 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15c20 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
15c30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15c40 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15c50 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15c60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15c70 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
15c80 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15c90 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
15ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15cb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15cd0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15ce0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15cf0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
15d00 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
15d10 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
15d20 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
15d30 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
15d40 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
15d50 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
15d60 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
15d70 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
15d80 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
15d90 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
15da0 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
15db0 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
15dc0 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
15dd0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
15de0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
15df0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
15e00 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
15e10 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
15e20 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
15e30 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
15e40 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
15e50 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
15e60 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
15e70 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
15e80 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
15e90 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
15ea0 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
15eb0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15ec0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
15ed0 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
15ee0 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
15ef0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f10 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
15f20 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
15f30 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
15f40 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
15f50 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
15f60 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
15f70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15f80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15f90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15fa0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15fb0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15fc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15fd0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
15fe0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
15ff0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
16000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16010 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16030 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  dif../*.** Chang
16040 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
16050 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
16060 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16070 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
16080 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
16090 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
160a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
160b0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
160c0 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
160d0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
160e0 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
160f0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
16100 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
16110 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
16120 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
16130 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
16140 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
16150 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
16160 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
16170 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
16180 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
16190 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
161a0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
161b0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
161c0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
161d0 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
161e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
161f0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
16200 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
16210 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
16220 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
16230 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
16240 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
16250 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
16260 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
16270 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
16280 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
16290 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
162a0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
162b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
162c0 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
162d0 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
162e0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
162f0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
16300 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
16310 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
16320 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
16330 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
16340 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
16350 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
16360 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
16370 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16380 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
16390 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
163a0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
163b0 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
163c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
163d0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
163e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
163f0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
16400 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
16410 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
16420 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16430 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  p);.#if SQLITE_H
16440 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
16450 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74  Reserve>pBt->opt
16460 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42  imalReserve ) pB
16470 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
16480 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65  e = (u8)nReserve
16490 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
164a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
164b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
164c0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
164d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
164e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
164f0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
16500 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
16510 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
16520 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
16530 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
16540 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
16550 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
16560 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
16570 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
16580 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
16590 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
165a0 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
165b0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
165c0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
165d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
165e0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
165f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
16600 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
16610 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
16620 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
16630 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
16640 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
16650 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16660 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
16670 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
16680 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
16690 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
166a0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
166b0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
166c0 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
166d0 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
166e0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
166f0 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
16700 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16720 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16730 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
16740 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
16750 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16760 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
16770 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
16780 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
16790 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
167a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
167b0 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
167c0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
167d0 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
167e0 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
167f0 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
16800 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
16810 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
16820 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
16830 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
16840 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
16850 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
16860 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
16870 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
16880 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
16890 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
168a0 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
168b0 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
168c0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
168d0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
168e0 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
168f0 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
16900 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16910 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
16920 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
16930 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
16940 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
16950 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
16960 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
16970 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
16980 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
16990 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
169a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
169b0 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
169c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
169d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
169e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
169f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
16a00 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
16a10 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
16a20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65  usableSize;.  re
16a30 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
16a40 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16a50 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
16a60 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
16a70 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
16a80 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
16a90 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
16aa0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
16ab0 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
16ac0 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
16ad0 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
16ae0 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  tensions..**.** 
16af0 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55  If SQLITE_HAS_MU
16b00 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74  TEX is defined t
16b10 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72  hen the number r
16b20 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
16b30 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65  * greater of the
16b40 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65   current reserve
16b50 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20  d space and the 
16b60 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65  maximum requeste
16b70 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61  d.** reserve spa
16b80 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
16b90 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61  e3BtreeGetOptima
16ba0 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  lReserve(Btree *
16bb0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
16bc0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16bd0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
16be0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
16bf0 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66  eNoMutex(p);.#if
16c00 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16c10 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  ODEC.  if( n<p->
16c20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16c30 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74  rve ) n = p->pBt
16c40 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16c50 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
16c60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16c70 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16c80 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
16c90 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
16ca0 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
16cb0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
16cc0 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
16cd0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
16ce0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
16cf0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
16d00 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
16d10 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
16d20 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
16d30 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
16d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16d50 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
16d60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
16d70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
16d80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16d90 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
16da0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
16db0 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
16dc0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
16dd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16de0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16df0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
16e00 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
16e10 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
16e20 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
16e30 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
16e40 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
16e50 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
16e60 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
16e70 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
16e80 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
16e90 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
16ea0 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
16eb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16ec0 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
16ed0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
16ee0 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
16ef0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
16f00 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
16f10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
16f20 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
16f30 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
16f40 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
16f50 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
16f60 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
16f70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
16f80 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
16f90 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
16fa0 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
16fb0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
16fc0 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
16fd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16fe0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
16ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
17000 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
17010 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
17020 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
17030 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
17040 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
17050 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
17060 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
17070 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
17080 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
17090 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
170a0 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
170b0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
170c0 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
170d0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
170e0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
170f0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
17100 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17110 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
17120 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
17130 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
17140 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17150 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
17160 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17170 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
17180 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17190 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
171a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
171b0 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
171c0 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
171d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
171e0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
171f0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
17200 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
17210 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
17220 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
17230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
17240 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
17250 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
17260 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
17270 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
17280 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
17290 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
172a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
172b0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
172c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
172d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
172e0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
172f0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
17300 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
17310 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
17320 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
17330 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
17340 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
17350 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
17360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
17370 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17380 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
17390 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
173a0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
173b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
173c0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
173d0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
173e0 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
173f0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
17400 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
17410 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
17420 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
17430 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
17440 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
17450 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17460 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17470 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
17480 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
17490 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
174a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
174b0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
174c0 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
174d0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
174e0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
174f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17500 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
17510 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
17520 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
17530 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
17540 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
17550 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
17560 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
17570 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
17580 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
17590 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
175a0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
175b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
175c0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
175d0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
175e0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
175f0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
17600 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17610 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
17620 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
17630 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
17640 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
17650 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
17660 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
17670 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
17680 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17690 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
176a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
176b0 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
176c0 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
176d0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
176e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
176f0 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
17700 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
17710 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
17720 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
17730 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
17740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17750 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
17760 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
17770 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
17780 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
17790 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
177a0 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
177b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
177c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
177d0 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
177e0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
177f0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
17800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17810 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
17820 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
17830 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
17840 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
17850 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
17860 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
17870 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
17880 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
17890 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
178a0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
178b0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
178c0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
178d0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
178e0 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
178f0 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
17900 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
17910 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
17920 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
17930 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
17940 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
17950 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
17960 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
17970 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
17980 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
17990 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
179a0 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
179b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
179c0 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
179d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
179e0 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
179f0 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
17a00 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
17a10 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
17a20 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
17a30 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
17a40 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
17a50 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
17a60 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
17a70 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
17a80 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
17a90 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
17aa0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
17ab0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17ac0 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
17ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
17ae0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17af0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
17b00 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17b10 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
17b20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
17b30 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
17b40 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17b50 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
17b60 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
17b70 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
17b80 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
17b90 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
17ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17bb0 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
17bc0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
17bd0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
17be0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
17bf0 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
17c00 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
17c10 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
17c20 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
17c30 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
17c40 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
17c50 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
17c60 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
17c70 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
17c80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
17c90 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
17ca0 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
17cb0 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
17cc0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
17cd0 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
17ce0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
17cf0 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
17d00 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
17d10 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
17d20 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
17d30 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
17d40 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
17d50 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
17d60 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
17d70 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
17d80 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
17d90 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
17da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17db0 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
17dc0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
17dd0 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
17de0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
17df0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
17e00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17e10 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
17e20 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
17e30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17e50 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17e60 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
17e70 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51 4c 49 54  }else{.#if SQLIT
17e80 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
17e90 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45  ONOUS!=SQLITE_DE
17ea0 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
17eb0 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20 20 73 71  ONOUS.        sq
17ec0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20  lite3 *db;.     
17ed0 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
17ee0 20 20 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d      if( (db=pBt-
17ef0 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d  >db)!=0 && (pDb=
17f00 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20  db->aDb)!=0 ){. 
17f10 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
17f20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70  pDb->pBt==0 || p
17f30 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42  Db->pBt->pBt!=pB
17f40 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20  t ){ pDb++; }.  
17f50 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
17f60 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a 20 20 20  >bSyncSet==0.   
17f70 20 20 20 20 20 20 20 20 26 26 20 70 44 62 2d 3e          && pDb->
17f80 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d 53 51  safety_level==SQ
17f90 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
17fa0 43 48 52 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20  CHRONOUS.       
17fb0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
17fc0 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
17fd0 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  vel = SQLITE_DEF
17fe0 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
17ff0 4e 4f 55 53 3b 0a 20 20 20 20 20 20 20 20 20 20  NOUS;.          
18000 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
18010 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
18020 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
18030 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
18040 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67  evel | (db->flag
18050 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f  s & PAGER_FLAGS_
18060 4d 41 53 4b 29 29 3b 0a 20 20 20 20 20 20 20 20  MASK));.        
18070 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
18080 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
18090 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
180a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
180b0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
180c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
180d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
180e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
180f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
18100 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ADB;.    }.#endi
18110 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
18120 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
18130 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
18140 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
18150 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
18160 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
18170 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
18180 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
18190 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
181a0 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
181b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
181c0 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
181d0 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
181e0 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
181f0 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
18200 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
18210 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
18220 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
18230 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
18240 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
18250 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
18260 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
18270 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
18290 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
182a0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
182b0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
182c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
182d0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
182e0 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
182f0 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
18300 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
18310 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
18320 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
18330 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
18340 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
18350 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
18360 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
18370 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
18380 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18390 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
183a0 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
183b0 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
183c0 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
183d0 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
183e0 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
183f0 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
18400 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
18410 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
18420 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
18430 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
18440 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
18450 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
18460 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18470 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
18480 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
18490 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
184a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
184b0 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
184c0 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
184d0 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
184e0 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
184f0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
18500 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18510 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
18520 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
18530 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
18540 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
18550 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
18560 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
18570 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
18580 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
18590 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
185a0 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
185b0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
185c0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
185d0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
185e0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
185f0 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
18600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18610 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
18620 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
18630 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
18640 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
18650 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
18660 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
18670 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
18680 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
18690 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
186a0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
186b0 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
186c0 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
186d0 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
186e0 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
186f0 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
18700 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
18710 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
18720 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
18730 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
18740 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
18750 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
18760 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
18770 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
18780 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
18790 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
187a0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
187b0 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
187c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
187d0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
187e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
187f0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
18800 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
18810 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
18820 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
18830 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
18840 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18850 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
18860 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
18870 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
188a0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
188b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
188c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
188d0 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
188e0 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
188f0 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
18900 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
18910 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18920 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18930 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18940 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18950 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
18960 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
18970 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
18980 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
18990 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
189a0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
189b0 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
189c0 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
189d0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
189e0 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
189f0 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
18a00 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
18a10 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
18a20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
18a30 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
18a40 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18a50 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
18a60 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
18a70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
18a80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
18a90 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
18aa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18ab0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
18ac0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
18ad0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
18ae0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
18af0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
18b00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
18b10 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
18b20 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
18b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
18b40 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
18b50 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
18b60 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
18b70 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
18b80 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
18b90 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
18ba0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
18bb0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
18bc0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
18bd0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
18be0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
18bf0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
18c00 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
18c10 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
18c20 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
18c30 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
18c40 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
18c50 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
18c60 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
18c70 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
18c80 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
18c90 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
18ca0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
18cb0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
18cc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
18cd0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
18ce0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
18cf0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
18d00 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
18d10 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
18d20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
18d30 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
18d40 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
18d50 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
18d60 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
18d70 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
18d80 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
18d90 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
18da0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
18db0 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
18dc0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
18dd0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
18de0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
18df0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
18e00 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
18e10 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
18e20 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
18e30 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
18e40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18e50 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
18e60 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
18e70 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
18e80 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
18e90 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
18ea0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
18eb0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
18ec0 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
18ed0 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
18ee0 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
18ef0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
18f00 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
18f10 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
18f20 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
18f30 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
18f40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
18f50 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18f60 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
18f70 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
18f80 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
18f90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
18fa0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
18fb0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18fc0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
18fd0 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
18fe0 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
18ff0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
19000 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
19010 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
19020 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
19030 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
19040 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
19050 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
19060 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
19070 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
19080 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
19090 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
190a0 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
190b0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
190c0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
190d0 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
190e0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
190f0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
19100 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
19110 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
19120 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
19130 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
19140 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
19150 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
19160 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
19170 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
19180 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
19190 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
191a0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
191b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
191c0 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
191d0 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
191e0 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
191f0 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
19200 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
19210 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
19220 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
19230 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
19240 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
19250 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
19260 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
19270 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
19280 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
19290 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
192a0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
192b0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
192c0 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
192d0 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
192e0 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
192f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19300 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
19310 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
19320 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19330 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19340 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
19350 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
19360 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
19370 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
19380 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
19390 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
193a0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
193b0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
193c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
193d0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
193e0 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
193f0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
19400 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19410 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
19420 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
19430 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
19440 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
19450 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
19460 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
19470 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19480 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
19490 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
194a0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
194b0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
194c0 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
194d0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
194e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
194f0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
19500 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
19510 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
19520 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
19530 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
19540 6c 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  l(pPage1);.  }.}
19550 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
19560 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
19570 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
19580 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
19590 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
195a0 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
195b0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
195c0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
195d0 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
195e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
195f0 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
19600 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19610 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
19620 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
19630 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
19640 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19650 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
19660 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
19670 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
19680 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19690 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
196a0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
196b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
196c0 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
196d0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
196e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
196f0 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
19700 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
19710 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
19720 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
19730 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
19740 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
19750 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
19760 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
19770 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
19780 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
19790 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
197a0 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
197b0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
197c0 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
197d0 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
197e0 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
197f0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
19800 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
19810 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
19820 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
19830 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
19840 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
19850 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
19860 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
19870 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
19880 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
19890 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
198a0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
198b0 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
198c0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
198d0 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
198e0 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
198f0 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
19900 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
19910 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
19920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19930 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
19940 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
19950 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
19960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
19970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
19980 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
19990 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
199a0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
199b0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
199c0 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
199d0 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
199e0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
199f0 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
19a00 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
19a10 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
19a20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
19a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
19a50 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
19a60 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
19a70 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
19a80 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
19a90 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
19aa0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
19ab0 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
19ac0 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
19ad0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
19ae0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
19af0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
19b00 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
19b10 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
19b20 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
19b30 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
19b40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19b50 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
19b60 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
19b70 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
19b80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19b90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19ba0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19bb0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
19bc0 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
19bd0 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
19be0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
19bf0 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
19c00 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
19c10 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
19c20 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
19c30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
19c40 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19c50 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
19c60 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
19c70 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
19c80 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
19c90 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
19ca0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
19cb0 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
19cc0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
19cd0 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
19ce0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
19cf0 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
19d00 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
19d10 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
19d20 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
19d30 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
19d40 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
19d50 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
19d60 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
19d70 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
19d80 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
19d90 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
19da0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
19db0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
19dc0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
19dd0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
19de0 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
19df0 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
19e00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19e10 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
19e20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
19e30 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
19e40 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
19e50 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
19e60 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
19e70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
19e80 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
19e90 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
19ea0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
19eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
19ec0 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
19ed0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
19ee0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
19ef0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
19f00 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
19f10 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
19f20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
19f30 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
19f40 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
19f50 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
19f60 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
19f70 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
19f80 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
19f90 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
19fa0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
19fb0 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
19fc0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
19fd0 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
19fe0 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
19ff0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
1a000 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
1a010 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
1a020 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
1a030 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
1a040 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
1a050 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
1a060 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
1a070 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
1a080 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
1a090 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
1a0a0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
1a0b0 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
1a0c0 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
1a0d0 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
1a0e0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
1a0f0 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
1a100 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
1a110 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
1a120 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
1a130 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
1a140 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
1a150 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
1a160 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
1a170 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
1a180 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
1a190 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
1a1a0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
1a1b0 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
1a1c0 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
1a1d0 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
1a1e0 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
1a1f0 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
1a200 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
1a210 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
1a220 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
1a230 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
1a240 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a250 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
1a260 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
1a270 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ag){.  BtShared 
1a280 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1a290 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a2a0 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
1a2b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a2c0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a2d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1a2e0 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
1a2f0 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
1a300 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
1a310 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
1a320 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
1a330 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
1a340 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
1a350 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1a360 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
1a370 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1a380 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a390 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
1a3a0 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
1a3b0 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
1a3c0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1a3d0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1a3e0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a3f0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1a400 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
1a410 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1a420 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  )==0 );..  /* Wr
1a430 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
1a440 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
1a450 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
1a460 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1a470 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1a480 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1a490 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
1a4a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a4b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1a4c0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1a4d0 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
1a4e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1a4f0 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20  ED_CACHE.  {.   
1a500 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
1a510 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20   = 0;.    /* If 
1a520 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
1a530 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
1a540 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
1a550 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
1a560 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73      ** on this s
1a570 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
1a580 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
1a590 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
1a5a0 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72  tion is.    ** r
1a5b0 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
1a5c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
1a5d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1a5e0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
1a5f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a600 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20  ANS_WRITE).     
1a610 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
1a620 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
1a630 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1a640 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
1a650 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20  Writer->db;.    
1a660 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
1a670 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f  >1 ){.      BtLo
1a680 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20  ck *pIter;.     
1a690 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1a6a0 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1a6b0 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1a6c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1a6d0 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
1a6e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c  ){.          pBl
1a6f0 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
1a700 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
1a710 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a720 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a730 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b  }.    if( pBlock
1a740 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a750 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
1a760 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
1a770 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1a780 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
1a790 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67  EDCACHE;.      g
1a7a0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1a7b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a7c0 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
1a7d0 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
1a7e0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1a7f0 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
1a800 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
1a810 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
1a820 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
1a830 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
1a840 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
1a850 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
1a860 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
1a870 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
1a880 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
1a890 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
1a8a0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
1a8b0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
1a8c0 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
1a8d0 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
1a8e0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
1a8f0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1a900 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
1a910 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
1a920 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
1a930 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1a940 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1a950 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
1a960 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
1a970 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
1a980 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
1a990 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
1a9a0 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
1a9b0 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
1a9c0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1a9d0 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
1a9e0 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
1a9f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
1aa00 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
1aa10 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
1aa20 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
1aa30 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
1aa40 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
1aa50 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1aa60 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
1aa70 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
1aa80 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
1aa90 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
1aaa0 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
1aab0 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
1aac0 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
1aad0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1aae0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
1aaf0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
1ab00 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
1ab10 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
1ab20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
1ab30 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
1ab40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ab50 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1ab60 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1ab70 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1ab80 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
1ab90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1aba0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
1abb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1abc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1abd0 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
1abe0 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
1abf0 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
1ac00 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
1ac10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ac20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1ac30 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1ac40 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
1ac50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ac60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ac70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ac80 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1ac90 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
1aca0 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
1acb0 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
1acc0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1acd0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1ace0 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
1acf0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
1ad00 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
1ad10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ad20 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1ad30 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1ad40 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
1ad50 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1ad60 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
1ad70 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1ad80 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
1ad90 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
1ada0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1adb0 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
1adc0 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
1add0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
1ade0 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
1adf0 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
1ae00 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
1ae10 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1ae20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
1ae30 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
1ae40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ae50 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
1ae60 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
1ae70 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
1ae80 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
1ae90 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
1aea0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1aeb0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1aec0 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
1aed0 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
1aee0 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
1aef0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1af00 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1af10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1af20 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1af30 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
1af40 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
1af50 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
1af60 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
1af70 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1af80 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
1af90 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
1afa0 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
1afb0 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
1afc0 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
1afd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
1afe0 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
1aff0 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
1b000 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
1b010 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
1b020 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
1b030 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
1b040 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
1b050 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
1b060 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
1b070 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
1b080 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
1b090 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1b0a0 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
1b0b0 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
1b0c0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1b0d0 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
1b0e0 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
1b0f0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
1b100 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
1b110 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
1b120 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1b130 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1b140 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
1b150 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1b160 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
1b170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b180 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1b190 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1b1a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b1b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b1c0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1b1d0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1b1e0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1b1f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b200 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
1b210 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
1b220 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1b230 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
1b240 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
1b250 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
1b260 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
1b270 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
1b280 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
1b290 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
1b2a0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1b2b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
1b2c0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
1b2d0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
1b2e0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
1b2f0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
1b300 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
1b310 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1b320 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1b330 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1b340 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
1b350 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
1b360 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1b370 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b380 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b390 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1b3a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b3b0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
1b3c0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
1b3d0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1b3e0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
1b3f0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
1b400 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
1b410 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
1b420 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1b430 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
1b440 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
1b450 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
1b460 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1b470 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
1b480 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
1b490 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
1b4a0 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4d0 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
1b4e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b510 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
1b520 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
1b530 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1b560 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1b570 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1b580 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
1b590 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
1b5a0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
1b5b0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
1b5c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b5d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1b5e0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1b5f0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
1b600 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1b610 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b620 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
1b630 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
1b640 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
1b650 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1b660 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1b670 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1b680 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1b690 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1b6a0 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
1b6b0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
1b6c0 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
1b6d0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1b6e0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
1b6f0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1b700 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
1b710 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1b720 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1b730 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1b740 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1b750 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1b760 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1b770 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1b780 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1b790 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1b7a0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
1b7b0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1b7c0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1b7d0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1b7e0 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
1b7f0 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
1b800 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
1b810 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
1b820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b830 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
1b840 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
1b850 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
1b860 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
1b870 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
1b880 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
1b890 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
1b8a0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
1b8b0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
1b8c0 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
1b8d0 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
1b8e0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
1b8f0 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
1b900 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1b910 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1b920 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
1b950 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1b960 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
1b970 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1b980 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1b990 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
1b9a0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1b9b0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
1b9c0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
1b9d0 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
1b9e0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1b9f0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
1ba00 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1ba10 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
1ba20 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
1ba30 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
1ba50 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1ba60 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1ba70 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
1ba80 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
1ba90 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
1baa0 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
1bab0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
1bac0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1bad0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1bae0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1baf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1bb00 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
1bb10 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
1bb20 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1bb30 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
1bb40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
1bb50 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
1bb60 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1bb70 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
1bb80 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
1bb90 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1bba0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
1bbb0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
1bbc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1bbd0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1bbe0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1bbf0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
1bc00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
1bc10 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
1bc20 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
1bc30 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1bc40 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  nCell;.    int r
1bc50 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72  c;..    rc = btr
1bc60 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1bc70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1bc80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
1bc90 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1bca0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
1bcb0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1bcc0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
1bcd0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1bce0 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
1bcf0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1bd00 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
1bd10 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1bd20 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  fo;.        pPag
1bd30 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
1bd40 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
1bd50 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1bd60 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
1bd70 2e 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20 20 20  .nPayload.      
1bd80 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f     && pCell+info
1bd90 2e 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67 65 2d  .nSize-1<=pPage-
1bda0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
1bdb0 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
1bdc0 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
1bdd0 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
1bde0 69 7a 65 2d 34 29 0a 20 20 20 20 20 20 20 20 29  ize-4).        )
1bdf0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1be00 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1be10 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20  nSize-4, iTo);. 
1be20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1be30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1be40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1be50 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
1be60 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
1be70 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1be80 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
1be90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1bea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1beb0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1bec0 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
1bed0 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
1bee0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
1bef0 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
1bf00 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1bf10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1bf20 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
1bf30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1bf40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1bf50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
1bf60 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1bf70 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1bf80 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
1bf90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
1bfa0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
1bfb0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
1bfc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bfd0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1bfe0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1bff0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
1c000 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
1c010 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
1c020 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
1c030 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
1c040 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
1c050 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
1c060 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
1c070 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1c080 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
1c090 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
1c0a0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
1c0b0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
1c0c0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1c0d0 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
1c0e0 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
1c0f0 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
1c100 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
1c110 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
1c120 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
1c130 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1c140 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
1c150 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c160 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1c170 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
1c180 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
1c190 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1c1a0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
1c1b0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
1c1c0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1c1d0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
1c1e0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1c1f0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
1c200 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1c210 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
1c220 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
1c230 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1c240 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
1c250 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
1c260 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
1c270 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
1c280 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1c290 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
1c2a0 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
1c2b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1c2c0 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
1c2d0 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
1c2e0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1c2f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
1c300 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
1c310 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
1c320 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
1c330 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
1c340 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1c350 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1c360 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1c370 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1c380 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1c390 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1c3a0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1c3b0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1c3c0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1c3d0 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1c3e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c3f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1c400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1c410 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1c420 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1c430 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1c440 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1c450 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1c460 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1c470 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1c480 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1c490 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1c4a0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1c4b0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1c4c0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1c4d0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1c4e0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1c4f0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1c500 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1c510 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1c520 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1c530 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1c540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c550 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1c560 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1c570 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1c580 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1c590 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1c5a0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1c5b0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1c5c0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1c5d0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1c5e0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1c5f0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1c600 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1c610 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1c620 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1c630 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1c640 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1c650 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1c660 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1c670 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1c680 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1c690 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1c6a0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1c6b0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1c6c0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1c6d0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1c6e0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1c6f0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1c700 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1c710 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1c720 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1c730 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1c740 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1c750 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1c760 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1c770 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c780 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1c790 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1c7a0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1c7b0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1c7c0 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1c7d0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1c7e0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1c7f0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1c800 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1c810 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1c820 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1c830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c850 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c860 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1c870 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1c880 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1c890 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1c8a0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1c8b0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1c8c0 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1c8d0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1c8e0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1c8f0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1c900 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1c910 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1c920 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1c930 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1c940 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1c950 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1c960 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1c970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c980 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c990 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1c9a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c9b0 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1c9c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1c9d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c9e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1c9f0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1ca00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ca10 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1ca20 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1ca30 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
1ca40 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
1ca50 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1ca60 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1ca70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
1ca90 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
1caa0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
1cab0 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
1cac0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1cad0 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1cae0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
1caf0 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
1cb00 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
1cb10 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1cb20 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
1cb30 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
1cb40 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
1cb50 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
1cb60 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
1cb70 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
1cb80 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
1cb90 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1cba0 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
1cbb0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1cbc0 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
1cbd0 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
1cbe0 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
1cbf0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1cc00 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
1cc10 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
1cc20 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1cc30 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1cc40 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1cc50 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
1cc60 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1cc70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
1cc80 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
1cc90 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
1cca0 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
1ccb0 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
1ccc0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
1ccd0 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
1cce0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
1ccf0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
1cd00 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
1cd10 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
1cd20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
1cd30 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
1cd40 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1cd50 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
1cd60 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1cd70 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
1cd80 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
1cd90 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
1cda0 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
1cdb0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
1cdc0 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
1cdd0 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
1cde0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
1cdf0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1ce00 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
1ce10 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
1ce20 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
1ce30 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
1ce40 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
1ce50 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
1ce60 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
1ce70 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1ce80 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
1ce90 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
1cea0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
1ceb0 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
1cec0 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
1ced0 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
1cee0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
1cef0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1cf00 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
1cf10 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
1cf20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1cf30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1cf40 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1cf50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1cf60 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
1cf70 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
1cf80 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1cf90 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
1cfa0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1cfb0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1cfc0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
1cfd0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
1cfe0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
1cff0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1d000 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1d010 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
1d020 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
1d030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1d040 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
1d050 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1d060 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
1d070 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
1d080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d0a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d0b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1d0c0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1d0d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d0e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1d0f0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
1d100 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d110 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1d120 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1d130 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
1d140 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
1d150 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
1d160 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
1d170 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
1d180 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
1d190 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
1d1a0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
1d1b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
1d1c0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1d1d0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1d1e0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
1d1f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
1d200 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
1d210 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
1d220 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
1d230 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
1d240 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
1d250 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1d260 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
1d270 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1d280 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1d290 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1d2a0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1d2b0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
1d2c0 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
1d2d0 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
1d2e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1d300 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1d310 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1d320 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
1d330 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
1d340 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1d350 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1d360 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1d370 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
1d380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d390 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
1d3a0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
1d3b0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
1d3c0 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
1d3d0 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
1d3e0 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
1d3f0 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
1d400 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1d410 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
1d420 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
1d430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
1d440 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
1d450 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1d460 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
1d470 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1d480 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
1d490 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
1d4a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d4c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d4d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1d4e0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
1d4f0 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
1d500 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
1d510 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
1d520 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
1d530 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1d540 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1d550 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1d560 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1d570 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1d580 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1d590 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1d5a0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1d5b0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1d5c0 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1d5d0 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1d5e0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1d5f0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1d600 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1d610 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1d620 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d630 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1d640 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1d650 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1d660 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1d670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1d680 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1d690 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1d6a0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1d6b0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1d6c0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1d6d0 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1d6e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1d6f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d700 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1d710 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1d720 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1d730 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1d740 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1d750 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1d760 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1d770 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1d780 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1d790 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1d7a0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1d7b0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1d7c0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1d7d0 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1d7e0 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1d7f0 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1d800 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1d810 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1d820 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d830 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d840 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1d850 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1d860 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1d870 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1d880 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1d890 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1d8a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1d8b0 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1d8c0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1d8d0 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1d8e0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1d8f0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1d900 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1d910 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d920 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1d930 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1d940 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1d950 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1d960 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1d970 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1d980 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1d990 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1d9a0 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1d9b0 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1d9c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1d9d0 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1d9e0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1d9f0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1da00 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1da10 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1da20 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
1da30 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
1da40 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1da70 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
1da80 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
1da90 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1dab0 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
1dac0 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
1dad0 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
1dae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1daf0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1db00 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
1db10 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
1db20 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
1db30 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
1db40 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
1db50 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
1db60 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
1db70 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
1db80 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
1db90 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
1dba0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1dbb0 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
1dbc0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1dbd0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1dbe0 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
1dbf0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1dc00 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
1dc10 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1dc20 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1dc30 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
1dc40 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
1dc50 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1dc60 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
1dc70 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
1dc80 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1dc90 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
1dca0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
1dcb0 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
1dcc0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1dcd0 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
1dce0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
1dcf0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
1dd00 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
1dd10 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
1dd20 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
1dd30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
1dd40 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
1dd50 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1dd60 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
1dd70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1dd80 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
1dd90 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1dda0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
1ddb0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
1ddc0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
1ddd0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1dde0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1ddf0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1de00 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1de10 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1de20 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1de30 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
1de40 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1de50 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
1de60 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1de70 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1de80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
1de90 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
1dea0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1deb0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
1dec0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1ded0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1dee0 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
1def0 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1df00 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1df10 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
1df20 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
1df30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1df40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1df50 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
1df60 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1df70 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1df80 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
1df90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dfa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1dfb0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1dfc0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1dfd0 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
1dfe0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1dff0 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
1e000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e020 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e030 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e040 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1e050 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e060 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1e070 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1e080 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1e090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e0a0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1e0b0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1e0c0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1e0d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1e0e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e0f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e100 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
1e110 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1e120 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
1e130 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1e140 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
1e150 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1e160 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
1e170 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e180 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
1e190 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
1e1a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1e1b0 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
1e1c0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1e1d0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
1e1e0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1e1f0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
1e200 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
1e210 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
1e220 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
1e230 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
1e240 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
1e250 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
1e260 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
1e270 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
1e280 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
1e290 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e2a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e2b0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1e2c0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
1e2d0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
1e2e0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1e2f0 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20  ); )..  assert( 
1e300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1e310 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1e320 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
1e330 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1e340 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
1e350 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
1e360 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
1e370 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1e380 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1e390 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e3a0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1e3b0 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
1e3c0 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
1e3d0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
1e3e0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e3f0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e400 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
1e410 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
1e420 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
1e430 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
1e440 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
1e450 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
1e460 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
1e470 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
1e480 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
1e490 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1e4a0 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
1e4b0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
1e4c0 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
1e4d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e4e0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
1e4f0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
1e500 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
1e510 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
1e520 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
1e530 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
1e540 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
1e550 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
1e560 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
1e570 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
1e580 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1e590 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1e5a0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1e5b0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
1e5c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e5d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1e5e0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
1e5f0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e600 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1e610 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1e620 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1e630 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
1e640 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
1e650 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e660 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
1e670 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
1e680 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1e690 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1e6a0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
1e6b0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
1e6c0 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
1e6d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
1e6e0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
1e6f0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1e700 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
1e710 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
1e720 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1e730 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
1e740 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
1e750 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1e760 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e770 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1e780 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e790 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e7a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1e7b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1e7c0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e7d0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
1e7e0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e7f0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e800 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
1e810 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
1e820 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1e830 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1e840 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
1e850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e860 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e870 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1e880 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1e890 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
1e8a0 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
1e8b0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1e8c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1e8d0 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
1e8e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e8f0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
1e900 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
1e910 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
1e920 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
1e930 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1e940 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1e950 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
1e960 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
1e970 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
1e980 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
1e990 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
1e9a0 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
1e9b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1e9c0 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
1e9d0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
1e9e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
1e9f0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
1ea00 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
1ea10 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
1ea20 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1ea30 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
1ea40 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
1ea50 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
1ea60 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
1ea70 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
1ea80 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
1ea90 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
1eaa0 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
1eab0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1eac0 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1ead0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1eae0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1eaf0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1eb00 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1eb10 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1eb20 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1eb30 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1eb40 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1eb50 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1eb60 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1eb70 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1eb80 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1eb90 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1eba0 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1ebb0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1ebc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1ebd0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1ebe0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1ebf0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1ec00 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1ec10 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1ec20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1ec30 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1ec40 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1ec50 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1ec60 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1ec70 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1ec80 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1ec90 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1eca0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1ecb0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1ecc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1ecd0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1ece0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1ecf0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1ed00 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1ed10 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1ed20 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1ed30 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1ed40 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1ed50 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1ed60 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1ed70 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1ed80 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1ed90 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1eda0 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1edb0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1edc0 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1edd0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1ede0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1edf0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1ee00 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1ee10 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1ee20 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1ee30 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1ee40 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1ee50 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1ee60 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1ee70 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1ee80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1ee90 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1eea0 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1eeb0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1eec0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1eed0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1eee0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1eef0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1ef00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ef10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ef20 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1ef30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ef40 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1ef50 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1ef60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1ef70 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1ef80 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1ef90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1efa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1efb0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1efc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1efd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1efe0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1eff0 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1f000 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1f010 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1f020 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1f030 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1f040 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1f050 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1f060 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1f070 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1f080 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1f090 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1f0a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f0b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f0c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1f0d0 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1f0e0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1f0f0 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1f100 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1f110 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1f120 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1f130 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1f140 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1f150 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1f160 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1f170 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f180 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
1f190 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1f1a0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
1f1b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f1c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f1d0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1f1e0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
1f1f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1f200 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
1f210 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
1f220 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1f230 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1f240 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1f250 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1f260 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1f270 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1f280 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1f290 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1f2a0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1f2b0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1f2c0 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1f2d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1f2e0 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1f2f0 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1f300 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1f310 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1f320 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
1f330 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
1f340 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
1f350 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
1f360 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
1f370 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
1f380 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1f390 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
1f3a0 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
1f3b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1f3c0 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
1f3d0 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
1f3e0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1f3f0 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
1f400 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1f410 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
1f420 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
1f430 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
1f440 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1f450 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
1f460 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
1f470 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1f480 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
1f490 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1f4a0 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
1f4b0 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
1f4c0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
1f4d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1f4e0 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
1f4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f500 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
1f510 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1f520 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
1f530 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
1f540 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
1f550 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
1f560 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
1f570 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1f580 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
1f590 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1f5a0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1f5b0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1f5c0 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
1f5d0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1f5e0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1f5f0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1f600 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
1f610 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
1f620 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1f630 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
1f640 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
1f650 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1f660 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
1f670 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1f680 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
1f690 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1f6a0 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
1f6b0 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
1f6c0 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
1f6d0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
1f6e0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1f6f0 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
1f700 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
1f710 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
1f720 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
1f730 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
1f740 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
1f750 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
1f760 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
1f770 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
1f780 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
1f790 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
1f7a0 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
1f7b0 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
1f7c0 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
1f7d0 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
1f7e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
1f7f0 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
1f800 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
1f810 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
1f820 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
1f830 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
1f840 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1f850 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
1f860 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
1f870 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
1f880 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1f890 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1f8a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1f8b0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
1f8c0 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
1f8d0 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
1f8e0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
1f8f0 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
1f900 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1f910 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
1f920 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
1f930 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
1f940 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
1f950 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
1f960 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
1f970 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f980 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f990 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
1f9a0 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
1f9b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f9c0 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
1f9d0 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
1f9e0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
1f9f0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
1fa00 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
1fa10 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
1fa20 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
1fa30 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
1fa40 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
1fa50 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
1fa60 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
1fa70 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
1fa80 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1fa90 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
1faa0 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
1fab0 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
1fac0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
1fad0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
1fae0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
1faf0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1fb00 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1fb10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1fb20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1fb30 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1fb40 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1fb50 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1fb60 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1fb70 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1fb80 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
1fb90 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
1fba0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1fbb0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
1fbc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fbd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1fbe0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1fbf0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1fc00 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1fc10 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
1fc20 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1fc30 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
1fc40 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
1fc50 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
1fc60 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1fc70 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
1fc80 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
1fc90 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1fca0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1fcb0 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
1fcc0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1fcd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1fce0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1fcf0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1fd00 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1fd10 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
1fd20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1fd30 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1fd40 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
1fd50 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
1fd60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
1fd70 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
1fd80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1fd90 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
1fda0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fdb0 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73      p->iDataVers
1fdc0 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65  ion--;  /* Compe
1fdd0 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72  nsate for pPager
1fde0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
1fdf0 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e  ; */.    pBt->in
1fe00 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1fe10 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1fe20 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1fe30 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1fe40 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1fe50 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1fe60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1fe70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fe80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
1fe90 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
1fea0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
1feb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1fec0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
1fed0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1fee0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1fef0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ff00 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1ff10 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
1ff20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ff30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ff40 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1ff50 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
1ff60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ff70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1ff80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1ff90 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1ffa0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1ffb0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1ffc0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1ffd0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1ffe0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e  ery cursor on an
1fff0 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  y BtShared that 
20000 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
20010 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65  nces.  Or if the
20020 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
20030 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65  is set to 1, the
20040 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77  n only.** trip w
20050 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64  rite cursors and
20060 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73   leave read curs
20070 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ors unchanged..*
20080 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
20090 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
200a0 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20   to be tripped, 
200b0 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
200c0 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67  s.** that belong
200d0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
200e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
200f0 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
20100 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20  .** sharing the 
20110 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
20120 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
20130 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
20140 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
20150 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65  k occurs. If the
20160 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c   writeOnly.** fl
20170 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
20180 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73   only write-curs
20190 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70  ors need be trip
201a0 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a  ped - read-only.
201b0 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20  ** cursors save 
201c0 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f  their current po
201d0 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20  sitions so that 
201e0 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75  they may continu
201f0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
20200 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72  the rollback. Or
20210 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  , if writeOnly i
20220 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72  s false, all cur
20230 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69  sors are .** tri
20240 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c  pped. In general
20250 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  , writeOnly is f
20260 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e  alse if the tran
20270 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a  saction being.**
20280 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64   rolled back mod
20290 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
202a0 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68  se schema. In th
202b0 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72  is case b-tree r
202c0 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79  oot.** pages may
202d0 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c   be moved or del
202e0 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
202f0 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65  tabase altogethe
20300 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20  r, making.** it 
20310 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20  unsafe for read 
20320 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69  cursors to conti
20330 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nue..**.** If th
20340 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
20350 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
20360 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
20370 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73  ered while .** s
20380 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aving the curren
20390 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20  t position of a 
203a0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
203b0 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a  , all cursors, .
203c0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  ** including all
203d0 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72   read-cursors ar
203e0 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a  e tripped..**.**
203f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20400 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
20410 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  sful, or if an e
20420 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
20430 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75  e.** saving a cu
20440 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61  rsor position, a
20450 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
20460 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
20470 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20480 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
20490 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
204a0 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
204b0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
204c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
204d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
204e0 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  t( (writeOnly==0
204f0 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31   || writeOnly==1
20500 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46  ) && BTCF_WriteF
20510 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
20520 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71  pBtree ){.    sq
20530 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20540 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72  pBtree);.    for
20550 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
20560 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
20570 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
20580 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
20590 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d  writeOnly && (p-
205a0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
205b0 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29  _WriteFlag)==0 )
205c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
205d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
205e0 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
205f0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
20600 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
20610 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
20620 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
20630 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20650 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
20660 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
20670 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c  lCursors(pBtree,
20680 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   rc, 0);.       
20690 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
206a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
206b0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
206c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
206d0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
206e0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  );.        p->eS
206f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
20700 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ULT;.        p->
20710 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
20720 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
20730 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
20740 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
20750 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20760 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
20770 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61  .        p->apPa
20780 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ge[i] = 0;.     
20790 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
207a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
207b0 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
207c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
207d0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
207e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
207f0 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ogress..**.** If
20800 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
20810 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
20820 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
20830 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69  invalidated (tri
20840 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77  pped)..** Only w
20850 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
20860 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
20870 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75  eOnly is true bu
20880 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  t all cursors ar
20890 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20  e.** tripped if 
208a0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
208b0 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  se.  Any attempt
208c0 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69   to use.** a tri
208d0 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c  pped cursor will
208e0 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
208f0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
20900 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
20910 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
20920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20930 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
20940 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
20950 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
20960 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
20970 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
20980 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
20990 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
209a0 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72  tripCode, int wr
209b0 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  iteOnly){.  int 
209c0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
209d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
209e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
209f0 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74  ..  assert( writ
20a00 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74  eOnly==1 || writ
20a10 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  eOnly==0 );.  as
20a20 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d  sert( tripCode==
20a30 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
20a40 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64  LBACK || tripCod
20a50 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
20a60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
20a70 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72  ter(p);.  if( tr
20a80 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
20a90 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72  K ){.    rc = tr
20aa0 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c  ipCode = saveAll
20ab0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
20ac0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
20ad0 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a   writeOnly = 0;.
20ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
20af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
20b00 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20  .  if( tripCode 
20b10 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
20b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
20b30 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
20b40 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e  ripCode, writeOn
20b50 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ly);.    assert(
20b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
20b70 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  | (writeOnly==0 
20b80 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  && rc2==SQLITE_O
20b90 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  K) );.    if( rc
20ba0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  2!=SQLITE_OK ) r
20bb0 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62  c = rc2;.  }.  b
20bc0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
20bd0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
20be0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
20bf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
20c00 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
20c10 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
20c20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
20c30 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
20c40 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
20c50 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
20c60 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
20c70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20c80 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
20c90 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
20ca0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
20cb0 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
20cc0 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
20cd0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
20ce0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
20cf0 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
20d00 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
20d10 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
20d20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
20d30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
20d40 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
20d50 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
20d60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20d70 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
20d80 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
20d90 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
20da0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
20db0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
20dc0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
20dd0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
20de0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
20df0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
20e00 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
20e10 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
20e20 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
20e30 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
20e40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
20e50 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
20e60 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
20e70 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
20e80 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
20e90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
20ea0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
20eb0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
20ec0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
20ed0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
20ee0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
20ef0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20f00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20f10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
20f20 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
20f30 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
20f40 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
20f50 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
20f60 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
20f70 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
20f80 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
20f90 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
20fa0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
20fb0 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
20fc0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
20fd0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
20fe0 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
20ff0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
21000 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
21010 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
21020 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
21030 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
21040 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
21050 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
21060 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
21070 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
21080 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
21090 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
210a0 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
210b0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
210c0 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
210d0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
210e0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
210f0 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
21100 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
21110 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
21120 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
21130 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
21140 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
21150 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
21160 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
21170 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
21180 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
21190 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
211a0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
211b0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
211c0 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
211d0 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
211e0 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
211f0 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
21200 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
21210 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
21220 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
21230 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
21240 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
21250 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
21260 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
21270 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
21280 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
21290 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
212a0 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
212b0 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
212c0 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
212d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
212e0 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
212f0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
21300 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
21310 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
21320 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
21330 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
21340 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
21350 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21360 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
21370 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21380 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
21390 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
213a0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
213b0 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ONLY)==0 );.  as
213c0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
213d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
213e0 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
213f0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
21400 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
21410 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
21420 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
21430 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
21440 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
21450 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
21460 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
21470 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
21480 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
21490 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
214a0 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
214b0 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
214c0 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
214d0 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
214e0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
214f0 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
21500 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
21510 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
21520 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
21530 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
21540 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
21550 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
21560 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
21570 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
21580 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
21590 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
215a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
215b0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
215c0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
215d0 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
215e0 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
215f0 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
21600 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
21610 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
21620 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
21630 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
21640 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
21650 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
21660 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
21670 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
21680 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
21690 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
216a0 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
216b0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
216c0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
216d0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
216e0 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
216f0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
21700 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
21710 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
21720 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
21730 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
21740 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
21750 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
21760 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
21770 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
21780 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
21790 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
217a0 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
217b0 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
217c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
217d0 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
217e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
217f0 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
21800 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
21810 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
21820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21830 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
21840 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
21850 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
21860 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21870 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
21880 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
21890 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
218a0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
218b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
218c0 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
218d0 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
218e0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
218f0 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
21900 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21910 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
21920 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
21930 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
21940 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
21950 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
21960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21970 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
21980 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  <0 && (pBt->btsF
21990 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49  lags & BTS_INITI
219a0 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29  ALLY_EMPTY)!=0 )
219b0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  {.        pBt->n
219c0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
219d0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  }.      rc = new
219e0 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
219f0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
21a00 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20  = get4byte(28 + 
21a10 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
21a20 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ta);..      /* T
21a30 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
21a40 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
21a50 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20  o the offset 28 
21a60 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20  of the header.  
21a70 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
21a80 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
21a90 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20  ted, so we know 
21aa0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61  that the value a
21ab0 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a  t offset.      *
21ac0 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e  * 28 is nonzero.
21ad0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
21ae0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
21af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
21b00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21b10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21b20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
21b30 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
21b40 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
21b50 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
21b60 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
21b70 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c  e. If a read-onl
21b80 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  y cursor is requ
21b90 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73  ested, it is ass
21ba0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
21bb0 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20   caller already 
21bc0 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72  has at least a r
21bd0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
21be0 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20  tion open.** on 
21bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72  the database alr
21c00 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65  eady. If a write
21c10 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65  -cursor is reque
21c20 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sted, then.** th
21c30 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75  e caller is assu
21c40 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f  med to have an o
21c50 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
21c60 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
21c70 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
21c80 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73  bit of wrFlag is
21c90 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65   clear, then the
21ca0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
21cb0 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20  .** be used for 
21cc0 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65  reading.  If the
21cd0 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74   BTREE_WRCSR bit
21ce0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
21cf0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
21d00 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
21d10 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69  ing or for writi
21d20 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
21d30 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
21d40 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d  ng.** are also m
21d50 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20 74  et.  These are t
21d60 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
21d70 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
21d80 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77  n order.** for w
21d90 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c  riting to be all
21da0 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
21db0 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
21dc0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
21dd0 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e   with wrFlag con
21de0 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52  taining BTREE_WR
21df0 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  CSR.**.** 2:  Ot
21e00 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
21e10 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
21e20 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
21e30 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
21e40 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
21e50 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
21e60 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
21e70 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
21e80 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
21e90 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
21ea0 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
21eb0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
21ec0 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
21ed0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
21ee0 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
21ef0 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
21f00 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
21f10 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
21f20 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
21f30 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
21f40 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
21f50 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
21f60 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
21f70 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
21f80 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
21f90 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
21fa0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
21fb0 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  he BTREE_FORDELE
21fc0 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  TE bit of wrFlag
21fd0 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20   may optionally 
21fe0 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45 5f  be set if BTREE_
21ff0 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e  WRCSR.** is set.
22000 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69    If FORDELETE i
22010 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61  s set, that is a
22020 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70   hint to the imp
22030 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
22040 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20  .** this cursor 
22050 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65  will only be use
22060 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64  d to seek to and
22070 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20   delete entries 
22080 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61  of an index.** a
22090 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67  s part of a larg
220a0 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  er DELETE statem
220b0 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c  ent.  The FORDEL
220c0 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20  ETE hint is not 
220d0 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  used by.** this 
220e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
220f0 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68   But in a hypoth
22100 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69  etical alternati
22110 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e  ve storage engin
22120 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69  e .** in which i
22130 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65  ndex entries are
22140 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
22150 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72  eleted when corr
22160 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a  esponding table.
22170 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65  ** rows are dele
22180 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45  ted, the FORDELE
22190 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e  TE flag is a hin
221a0 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20  t that all SEEK 
221b0 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70  and DELETE.** op
221c0 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73  erations on this
221d0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e   cursor can be n
221e0 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45  o-ops and all RE
221f0 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61  AD operations ca
22200 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e  n .** return a n
22210 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73  ull row (2-bytes
22220 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a  : 0x01 0x00)..**
22230 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
22240 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
22250 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
22260 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
22270 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
22280 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
22290 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
222a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
222b0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
222c0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
222d0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
222e0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
222f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
22300 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
22310 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
22320 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
22330 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
22340 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
22350 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
22360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22370 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
22380 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
223b0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
223c0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
223e0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
223f0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
22400 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22420 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
22430 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
22440 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
22450 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
22460 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
22470 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
22480 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
22490 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
224a0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
224d0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
224e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
224f0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
22500 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
22510 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
22520 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58  /.  BtCursor *pX
22530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
22550 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72  oping over other
22560 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a   all cursors */.
22570 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22580 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
22590 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
225a0 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20  ( wrFlag==0 .   
225b0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42      || wrFlag==B
225c0 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20  TREE_WRCSR .    
225d0 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42     || wrFlag==(B
225e0 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45  TREE_WRCSR|BTREE
225f0 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29  _FORDELETE) .  )
22600 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
22610 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
22620 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
22630 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
22640 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
22650 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
22660 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
22670 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
22680 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
22690 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
226a0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
226b0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
226c0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
226d0 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
226e0 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
226f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
22700 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
22710 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
22720 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28  , pKeyInfo!=0, (
22730 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a  wrFlag?2:1)) );.
22740 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
22750 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
22760 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
22770 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
22780 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
22790 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
227a0 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
227b0 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
227c0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
227d0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
227e0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
227f0 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
22800 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22810 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
22820 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
22830 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
22840 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
22850 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73  ==0 || (pBt->bts
22860 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
22870 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20  _ONLY)==0 );..  
22880 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
22890 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
228a0 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66  ace(pBt);.    if
228b0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
228c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
228d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
228e0 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65    }.  if( iTable
228f0 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65  ==1 && btreePage
22900 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b  count(pBt)==0 ){
22910 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46  .    assert( wrF
22920 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54  lag==0 );.    iT
22930 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  able = 0;.  }.. 
22940 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
22950 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
22960 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
22970 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
22980 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
22990 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74  ables and link t
229a0 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
229b0 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
229c0 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67  .  */.  pCur->pg
229d0 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
229e0 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69  Table;.  pCur->i
229f0 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75  Page = -1;.  pCu
22a00 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
22a10 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
22a20 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
22a30 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
22a40 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
22a50 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f  = wrFlag ? BTCF_
22a60 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20  WriteFlag : 0;. 
22a70 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
22a80 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20  lags = wrFlag ? 
22a90 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 : PAGER_GET_RE
22aa0 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20  ADONLY;.  /* If 
22ab0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
22ac0 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
22ad0 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
22ae0 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20   then all such. 
22af0 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73   ** cursors *mus
22b00 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46  t* have the BTCF
22b10 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
22b20 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d  et. */.  for(pX=
22b30 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58  pBt->pCursor; pX
22b40 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
22b50 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e  .    if( pX->pgn
22b60 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61  oRoot==(Pgno)iTa
22b70 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d  ble ){.      pX-
22b80 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
22b90 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
22ba0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
22bb0 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
22bc0 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  e;.    }.  }.  p
22bd0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
22be0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74  ->pCursor;.  pBt
22bf0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
22c00 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
22c10 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
22c20 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  D;.  return SQLI
22c30 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
22c40 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
22c50 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c80 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
22c90 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22cc0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
22cd0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
22ce0 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
22d10 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
22d20 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
22d30 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
22d40 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
22d50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
22d60 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
22d70 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
22d80 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22da0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
22db0 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
22dc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
22dd0 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20  f( iTable<1 ){. 
22de0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22df0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22e00 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
22e10 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
22e20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75      rc = btreeCu
22e30 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
22e40 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
22e50 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  , pCur);.    sql
22e60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
22e70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22e80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
22e90 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
22ea0 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
22eb0 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
22ec0 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
22ed0 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
22ee0 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
22ef0 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
22f00 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
22f10 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
22f20 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
22f30 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
22f40 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
22f50 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
22f60 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
22f70 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
22f80 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
22f90 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
22fa0 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
22fb0 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
22fc0 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
22fd0 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
22fe0 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
22ff0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
23000 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
23010 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
23020 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
23030 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
23040 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
23050 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
23060 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
23070 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
23080 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
23090 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
230a0 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
230b0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
230c0 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
230d0 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
230e0 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
230f0 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
23100 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
23110 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
23120 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
23130 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
23140 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
23150 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
23160 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
23170 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
23180 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
23190 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
231a0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
231b0 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
231c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
231d0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
231e0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
231f0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
23200 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
23210 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
23220 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
23230 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
23240 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
23250 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
23260 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
23270 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
23280 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
23290 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
232a0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
232b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
232c0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
232d0 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ur);.    assert(
232e0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30   pBt->pCursor!=0
232f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   );.    if( pBt-
23300 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29  >pCursor==pCur )
23310 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
23320 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
23330 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
23340 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70       BtCursor *p
23350 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72  Prev = pBt->pCur
23360 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  sor;.      do{. 
23370 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
23380 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b  ->pNext==pCur ){
23390 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76  .          pPrev
233a0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
233b0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
233c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
233d0 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  }.        pPrev 
233e0 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a  = pPrev->pNext;.
233f0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c        }while( AL
23400 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20  WAYS(pPrev) );. 
23410 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
23420 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
23430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
23440 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
23450 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
23460 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
23470 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
23480 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23490 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
234a0 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
234b0 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
234c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
234d0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
234e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
234f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23500 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
23510 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
23520 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
23530 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
23540 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
23550 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
23560 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
23570 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
23580 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
23590 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
235a0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
235b0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
235c0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
235d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
235e0 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
235f0 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
23600 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
23610 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
23620 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64  Cell()..*/.#ifnd
23630 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
23640 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
23650 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
23660 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
23670 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
23680 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
23690 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
236a0 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
236b0 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
236c0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
236d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
236e0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
236f0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
23700 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
23710 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
23720 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
23730 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
23740 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
23750 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
23760 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
23770 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
23780 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
23790 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
237a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
237b0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
237c0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
237d0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
237e0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75  ->iPage;.    pCu
237f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
23800 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
23810 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
23820 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
23830 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
23840 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
23850 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  info);.  }else{.
23860 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
23870 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  fo(pCur);.  }.}.
23880 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
23890 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
238a0 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
238b0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
238c0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
238d0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
238e0 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
238f0 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
23900 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
23910 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
23920 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
23930 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
23940 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
23950 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
23960 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
23970 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
23980 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
23990 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
239a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
239b0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
239c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
239d0 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
239e0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
239f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
23a00 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
23a10 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
23a20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
23a30 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
23a40 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
23a50 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
23a60 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
23a70 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
23a80 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
23a90 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
23aa0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
23ab0 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
23ac0 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
23ad0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
23ae0 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
23af0 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
23b00 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
23b10 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
23b20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
23b30 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
23b40 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
23b50 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
23b60 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
23b70 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
23b80 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
23b90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
23ba0 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
23bb0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
23bc0 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
23bd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
23be0 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
23bf0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
23c00 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
23c10 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23c20 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23c30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23c40 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23c50 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
23c60 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70  r);.  *pSize = p
23c70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
23c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23c90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
23ca0 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
23cb0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
23cc0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
23cd0 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
23ce0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
23cf0 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
23d00 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
23d10 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
23d20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
23d30 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
23d40 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
23d50 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
23d60 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
23d70 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
23d80 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
23d90 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
23da0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
23db0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
23dc0 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
23dd0 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
23de0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
23df0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
23e00 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
23e10 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
23e20 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
23e30 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
23e40 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
23e50 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
23e60 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
23e70 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
23e80 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
23e90 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
23ea0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
23eb0 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
23ec0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23ed0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
23ee0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23ef0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23f00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23f10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
23f20 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Page>=0 );.  ass
23f30 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23f40 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
23f50 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
23f60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23f70 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b  ur->iPage]->intK
23f80 65 79 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67  eyLeaf==1 );.  g
23f90 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
23fa0 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
23fb0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
23fc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23fd0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
23fe0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
23ff0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
24000 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
24010 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
24020 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
24030 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
24040 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
24050 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
24060 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
24070 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
24080 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
24090 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
240a0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
240b0 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
240c0 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
240d0 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
240e0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
240f0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
24100 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
24110 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
24120 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
24130 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
24140 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
24150 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
24160 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
24170 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
24180 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
24190 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
241a0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
241b0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
241c0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
241d0 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
241e0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
241f0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
24200 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
24210 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
24220 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
24230 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
24240 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
24250 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
24260 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
24270 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
24280 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
24290 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
242a0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
242b0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
242c0 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
242d0 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
242e0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
242f0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
24300 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
24310 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
24320 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
24330 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
24340 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
24350 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
24360 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
24370 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
24380 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
24390 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
243a0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
243b0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
243c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
243d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
243e0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24400 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
24410 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
24420 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
24430 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
24440 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
24450 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
24460 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
24470 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
24480 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
24490 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
244a0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
244b0 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
244c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
244d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
244e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
244f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24500 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
24510 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
24520 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
24530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24540 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24550 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
24560 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
24570 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
24580 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
24590 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
245a0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
245b0 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
245c0 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
245d0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
245e0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
245f0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
24600 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
24610 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
24620 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
24630 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
24640 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
24650 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
24660 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
24670 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
24680 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
24690 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
246a0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
246b0 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
246c0 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
246d0 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
246e0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
246f0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
24700 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
24710 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
24720 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
24730 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
24740 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
24750 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
24760 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
24770 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
24780 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
24790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
247a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
247b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
247c0 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
247d0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
247e0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
247f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24800 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
24810 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
24820 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
24830 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
24840 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
24850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24860 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
24870 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
24880 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67  , &pPage, (ppPag
24890 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45  e==0) ? PAGER_GE
248a0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
248b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
248c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
248d0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
248e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
248f0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
24900 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
24910 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
24920 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
24930 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
24940 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
24950 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
24960 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
24970 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
24980 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
24990 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
249a0 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
249b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
249c0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
249d0 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
249e0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
249f0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
24a00 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
24a10 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
24a20 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
24a30 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
24a40 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
24a50 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
24a60 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
24a70 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
24a80 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
24a90 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
24aa0 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
24ab0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
24ac0 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
24ad0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
24ae0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
24af0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
24b00 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
24b10 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
24b20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
24b30 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
24b40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24b50 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
24b60 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
24b70 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
24b80 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
24b90 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
24ba0 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
24bb0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
24bc0 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
24bd0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
24be0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
24bf0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
24c00 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
24c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24c20 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
24c30 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
24c40 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
24c50 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
24c60 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
24c70 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
24c80 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
24c90 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
24ca0 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
24cb0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
24cc0 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
24cd0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
24ce0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
24cf0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
24d00 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
24d10 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
24d20 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
24d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24d60 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
24d70 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
24d80 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
24d90 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
24da0 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
24db0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
24dc0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
24dd0 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
24de0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
24df0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24e00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
24e10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
24e20 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
24e30 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
24e40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
24e50 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
24e60 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
24e70 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
24e80 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72  o. The eOp.** ar
24e90 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70  gument is interp
24ea0 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
24eb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65  :.**.**   0: The
24ec0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
24ed0 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74  read. Populate t
24ee0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
24ef0 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f  e..**   1: The o
24f00 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72  peration is a wr
24f10 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ite. Populate th
24f20 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24f30 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70  ..**   2: The op
24f40 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
24f50 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61  d. Do not popula
24f60 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
24f70 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
24f80 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
24f90 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
24fa0 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
24fb0 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
24fc0 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
24fd0 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
24fe0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
24ff0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
25000 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
25010 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
25020 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
25030 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
25040 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
25050 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
25060 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
25070 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
25080 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
25090 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
250a0 70 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a  pages and the.**
250b0 20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73   eOp argument is
250c0 20 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e   not 2, this fun
250d0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
250e0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
250f0 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75   lazily .** popu
25100 6c 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  lates the overfl
25110 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
25120 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
25130 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
25140 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
25150 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
25160 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
25170 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
25180 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
25190 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
251a0 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
251b0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
251c0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
251d0 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
251e0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
251f0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
25200 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
25210 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
25220 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
25230 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
25240 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
25250 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
25260 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
25270 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
25280 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
25290 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
252a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
252b0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
252c0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
252d0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
252e0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
252f0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
25300 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
25310 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
25320 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
25330 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
25340 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
25350 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
25360 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
25370 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
25380 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
25390 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
253a0 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
253b0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
253c0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
253d0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
253e0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25400 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
25410 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
25420 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
25430 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
25440 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
25450 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25470 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
25480 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
25490 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
254a0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
254b0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
254c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
254d0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
254e0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
254f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25500 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
25510 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
25520 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
25530 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
25540 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
25550 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
25560 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
25570 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
25580 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
25590 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
255a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
255b0 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
255c0 20 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e   pBuf;.  int bEn
255d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
25600 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20  ading to end of 
25610 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  data */.#endif..
25620 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
25630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25640 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25650 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25660 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25670 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
25680 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
25690 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
256a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
256b0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21  ;.  assert( eOp!
256c0 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20  =2 || offset==0 
256d0 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  );    /* Always 
256e0 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
256f0 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
25700 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
25710 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
25720 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
25730 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65  .pPayload;.#ifde
25740 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
25750 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
25760 62 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d  bEnd = offset+am
25770 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  t==pCur->info.nP
25780 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20  ayload;.#endif. 
25790 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
257a0 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
257b0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
257c0 20 69 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70   if( &aPayload[p
257d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
257e0 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
257f0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
25800 65 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  e] ){.    /* Try
25810 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
25820 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
25830 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
25840 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
25850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25860 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25870 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
25880 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
25890 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
258a0 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
258b0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
258c0 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
258d0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
258e0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
258f0 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
25900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25910 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
25920 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25930 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
25940 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
25950 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
25960 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
25970 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20  , (eOp & 0x01), 
25980 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
25990 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
259a0 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
259b0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
259c0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
259d0 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
259e0 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20  nLocal;.  }...  
259f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25a00 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
25a10 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
25a20 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
25a30 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
25a40 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
25a50 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
25a60 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
25a70 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
25a80 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
25a90 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
25aa0 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f  nLocal]);..    /
25ab0 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
25ac0 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61  r.aOverflow[] ha
25ad0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
25ae0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
25af0 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78  t now..    ** Ex
25b00 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c  cept, do not all
25b10 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b  ocate aOverflow[
25b20 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20  ] for eOp==2..  
25b30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
25b40 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
25b50 79 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e  y is sized at on
25b60 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
25b70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
25b80 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65     ** in the ove
25b90 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
25ba0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25bb0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
25bc0 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a  ow page is.    *
25bd0 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  * stored in aOve
25be0 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41  rflow[0], etc. A
25bf0 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
25c00 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
25c10 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e  rray.    ** mean
25c20 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
25c30 22 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  " (the cache is 
25c40 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
25c50 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
25c60 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75  ( eOp!=2 && (pCu
25c70 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
25c80 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
25c90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
25ca0 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
25cb0 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
25cc0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
25cd0 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
25ce0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  e;.      if( nOv
25cf0 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c  fl>pCur->nOvflAl
25d00 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50  loc ){.        P
25d10 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e  gno *aNew = (Pgn
25d20 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  o*)sqlite3Reallo
25d30 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
25d40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
25d50 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50  nOvfl*2*sizeof(P
25d60 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
25d70 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
25d80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25d90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25da0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
25db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25dc0 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
25dd0 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
25de0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
25df0 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
25e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25e10 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
25e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25e30 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
25e40 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
25e50 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
25e60 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
25e70 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
25e80 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
25e90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25ea0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
25eb0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
25ec0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
25ed0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
25ee0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
25ef0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
25f00 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
25f10 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
25f20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
25f30 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
25f40 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
25f50 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
25f60 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
25f70 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
25f80 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
25f90 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
25fa0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
25fb0 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
25fc0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
25fd0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
25fe0 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
25ff0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
26000 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
26010 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
26020 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
26030 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
26040 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
26050 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
26060 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
26070 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
26080 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
26090 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
260a0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
260b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
260c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f  assert( pCur->aO
260d0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30  verflow[iIdx]==0
260e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
260f0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
26100 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
26110 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  age.            
26120 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
26130 42 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  B );.        pCu
26140 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26150 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
26160 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
26170 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
26180 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
26190 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
261a0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
261b0 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
261c0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
261d0 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
261e0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
261f0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
26200 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
26210 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
26220 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
26230 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
26240 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
26250 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
26260 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
26270 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
26280 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
26290 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
262a0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
262b0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
262c0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
262d0 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  at the aOverflow
262e0 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65  [] array must be
262f0 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75   allocated becau
26300 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20  se eOp!=2.      
26310 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65    ** here.  If e
26320 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73  Op==2, then offs
26330 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62  et==0 and this b
26340 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74  ranch is never t
26350 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aken..        */
26360 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26370 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20   eOp!=2 );.     
26380 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
26390 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
263a0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
263b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
263c0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
263d0 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
263e0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
263f0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
26400 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
26410 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
26420 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
26430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26440 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
26450 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
26460 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
26470 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
26480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
26490 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
264a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
264b0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
264c0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
264d0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
264e0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
264f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
26500 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
26510 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
26520 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
26530 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
26540 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
26550 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
26560 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
26570 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
26580 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *fd;.#endif.    
26590 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
265a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
265b0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
265c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
265d0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
265e0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
265f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26600 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
26610 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
26620 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
26630 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
26640 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26650 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
26660 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
26670 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
26680 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
26690 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
266a0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
266b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
266c0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
266d0 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65   3) the database
266e0 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
266f0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
26700 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f    4) there is no
26710 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
26720 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
26730 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
26740 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
26750 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
26760 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
26770 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
26780 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
26790 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a   read..        *
267a0 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20  *   7) at least 
267b0 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72  4 bytes have alr
267c0 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69  eady been read i
267d0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
267e0 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a  uffer .        *
267f0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
26800 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
26810 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
26820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26830 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
26840 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
26850 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
26860 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
26870 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
26880 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
26890 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
268a0 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
268b0 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
268c0 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
268d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
268e0 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20   (eOp&0x01)==0  
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26910 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
26920 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
26930 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26960 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
26970 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f  && (bEnd || a==o
26980 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20  vflSize)        
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
269b0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
269c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
269d0 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20  TRANS_READ      
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
269f0 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
26a00 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74    && (fd = sqlit
26a10 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
26a20 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68  >pPager))->pMeth
26a30 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a  ods     /* (3) *
26a40 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
26a50 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
26a60 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20  [19]==0x01      
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20   /* (5) */.     
26a90 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d      && &pBuf[-4]
26aa0 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20  >=pBufStart     
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29            /* (7)
26ad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
26ae0 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
26af0 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
26b00 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
26b10 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
26b20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
26b30 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b50 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20         /* hence 
26b60 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (7) */.         
26b70 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
26b80 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
26b90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26ba0 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
26bb0 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
26bc0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
26bd0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
26be0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
26bf0 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
26c00 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
26c10 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
26c20 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
26c30 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
26c40 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
26c50 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
26c60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26c70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
26c80 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
26c90 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
26ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
26cb0 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20  (eOp&0x01)==0 ? 
26cc0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
26cd0 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
26ce0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
26cf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26d10 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
26d20 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
26d30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
26d40 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
26d50 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
26d60 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
26d70 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
26d80 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
26d90 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  t+4], pBuf, a, (
26da0 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61  eOp&0x01), pDbPa
26db0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
26dc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
26dd0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
26de0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
26df0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
26e00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26e10 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
26e20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
26e30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26e40 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
26e50 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
26e60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26e70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
26e80 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
26e90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
26ea0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
26eb0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
26ec0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
26ed0 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
26ee0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
26ef0 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20  ransferred into 
26f00 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
26f10 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
26f20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
26f30 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
26f40 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
26f50 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
26f60 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
26f70 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
26f80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
26f90 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
26fa0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
26fb0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
26fc0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
26fd0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
26fe0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
26ff0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
27000 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
27010 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
27020 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27030 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
27040 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
27050 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
27060 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
27070 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
27080 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
27090 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
270a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
270b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
270c0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
270d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
270e0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
270f0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
27100 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
27110 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27120 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
27130 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
27140 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
27150 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
27160 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
27170 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
27180 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
27190 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
271a0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
271b0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
271c0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
271d0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
271e0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
271f0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
27200 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
27210 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
27220 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
27230 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
27240 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
27250 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
27260 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
27270 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
27280 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
27290 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
272a0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
272b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
272c0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
272d0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
272e0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
272f0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
27300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27310 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
27320 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
27330 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
27340 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
27350 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
27360 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
27370 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
27380 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
27390 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
273a0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
273b0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
273c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
273d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
273e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
273f0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
27400 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27410 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
27420 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
27430 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27440 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27450 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
27460 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27470 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
27480 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
27490 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
274a0 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
274b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
274c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
274d0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
274e0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
274f0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
27500 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
27510 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
27520 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
27530 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
27540 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
27550 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
27560 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
27570 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
27580 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
27590 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
275a0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
275b0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
275c0 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
275d0 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
275e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
275f0 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
27600 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
27610 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
27620 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
27630 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
27640 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
27650 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
27660 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
27670 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
27680 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
27690 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
276a0 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
276b0 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
276c0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
276d0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
276e0 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
276f0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
27700 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
27710 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
27720 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
27730 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
27740 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
27750 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
27760 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
27770 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
27780 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
27790 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
277a0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
277b0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
277c0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
277d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
277e0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
277f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
27800 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
27810 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
27820 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
27830 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
27840 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
27850 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
27860 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
27870 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
27880 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
27890 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
278a0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
278b0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
278c0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
278d0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
278e0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
278f0 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
27900 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
27910 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
27920 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
27930 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73  .  u32 amt;.  as
27940 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
27950 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27960 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
27970 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
27980 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27990 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
279a0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
279b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
279c0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
279d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
279e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
279f0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
27a00 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27a10 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27a20 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
27a30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27a40 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  e]->nCell );.  a
27a50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
27a60 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61  o.nSize>0 );.  a
27a70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
27a80 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d  o.pPayload>pCur-
27a90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27aa0 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43  age]->aData || C
27ab0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
27ac0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
27ad0 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
27ae0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27af0 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c  age]->aDataEnd |
27b00 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20  |CORRUPT_DB);.  
27b10 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72  amt = (int)(pCur
27b20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27b30 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20  Page]->aDataEnd 
27b40 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  - pCur->info.pPa
27b50 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43  yload);.  if( pC
27b60 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  ur->info.nLocal<
27b70 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72  amt ) amt = pCur
27b80 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
27b90 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20   *pAmt = amt;.  
27ba0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
27bb0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27bc0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
27bd0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
27be0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
27bf0 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
27c00 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
27c10 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
27c20 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
27c30 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
27c40 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
27c50 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
27c60 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
27c70 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
27c80 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
27c90 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
27ca0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
27cb0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
27cc0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
27cd0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
27ce0 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
27cf0 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
27d00 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
27d10 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
27d20 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
27d30 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
27d40 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
27d50 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
27d60 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
27d70 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
27d80 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
27d90 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
27da0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
27db0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
27dc0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
27dd0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
27de0 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
27df0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
27e00 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
27e10 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
27e20 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
27e30 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
27e40 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
27e50 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
27e60 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73  r, pAmt);.}.cons
27e70 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
27e80 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
27e90 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
27ea0 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
27eb0 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
27ec0 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
27ed0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
27ee0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
27ef0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
27f00 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
27f10 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
27f20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
27f30 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
27f40 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
27f50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
27f60 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
27f70 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
27f80 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
27f90 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
27fa0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
27fb0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
27fc0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
27fd0 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
27fe0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
27ff0 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
28000 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
28010 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
28020 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
28030 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
28040 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
28050 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
28060 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
28070 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
28080 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
28090 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
280a0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
280b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
280c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
280d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
280e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
280f0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
28100 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
28110 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
28120 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
28130 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
28140 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
28150 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28160 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
28170 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66  .  }.  pCur->inf
28180 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
28190 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
281a0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
281b0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
281c0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
281d0 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ++;.  pCur->aiId
281e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
281f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74   0;.  return get
28200 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
28210 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d   newPgno, &pCur-
28220 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28230 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  age],.          
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
28250 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ur, pCur->curPag
28260 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66  erFlags);.}..#if
28270 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
28280 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
28290 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
282a0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
282b0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
282c0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
282d0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
282e0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
282f0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
28300 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
28310 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
28320 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
28330 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
28340 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
28350 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
28360 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
28370 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
28380 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
28390 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
283a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
283b0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
283c0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
283d0 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
283e0 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
283f0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
28400 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
28410 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
28420 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
28430 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28450 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
28460 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
28470 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
28480 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
28490 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
284a0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
284b0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
284c0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
284d0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
284e0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
284f0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
28500 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
28510 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
28520 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
28530 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
28540 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
28550 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
28560 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
28570 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
28580 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
28590 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
285a0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
285b0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
285c0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
285d0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
285e0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
285f0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
28600 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
28610 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
28620 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
28630 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
28640 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
28650 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
28660 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
28670 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
28680 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
28690 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
286a0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
286b0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
286c0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
286d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
286e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
286f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28700 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
28710 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
28720 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28730 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
28740 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
28750 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28760 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
28770 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28780 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
28790 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
287a0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
287b0 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
287c0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
287d0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
287e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
287f0 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
28800 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
28810 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
28820 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
28830 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
28840 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
28850 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
28860 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
28870 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28880 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  --]);.}../*.** M
28890 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
288a0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
288b0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
288c0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
288d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
288e0 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
288f0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
28900 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
28910 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
28920 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
28930 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
28940 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
28950 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
28960 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
28970 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
28980 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
28990 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
289a0 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
289b0 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
289c0 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
289d0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
289e0 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
289f0 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
28a00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
28a10 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
28a20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
28a30 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
28a40 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
28a50 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
28a60 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
28a70 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
28a80 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
28a90 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
28aa0 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
28ab0 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
28ac0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
28ad0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
28ae0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
28af0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
28b00 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
28b10 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
28b20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
28b30 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
28b40 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
28b50 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
28b60 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
28b70 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
28b80 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
28b90 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
28ba0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
28bb0 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
28bc0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
28bd0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
28be0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
28bf0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
28c00 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
28c10 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
28c20 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
28c30 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
28c40 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
28c50 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
28c60 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
28c70 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
28c80 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
28c90 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
28ca0 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
28cb0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
28cc0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
28cd0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
28ce0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
28cf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
28d00 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
28d10 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
28d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
28d30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
28d40 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28d50 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
28d60 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
28d70 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28d80 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
28d90 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
28da0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
28db0 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
28dc0 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
28dd0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
28de0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
28df0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
28e00 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
28e10 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
28e20 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
28e30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
28e40 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
28e50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
28e60 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
28e70 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
28e80 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
28e90 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
28ea0 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
28eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28ec0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28ed0 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20  iPage]!=0 );.   
28ee0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
28ef0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
28f00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
28f10 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
28f20 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
28f30 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
28f40 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28f50 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28f70 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
28f80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28f90 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20  Page==(-1) );.  
28fa0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
28fb0 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
28fc0 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
28fd0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
28fe0 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
29010 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
29020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29030 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
29040 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29050 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
29060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
29070 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
29080 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
29090 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
290a0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
290b0 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
290c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
290d0 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
290e0 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
290f0 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
29100 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
29110 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
29120 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
29130 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
29140 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
29150 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
29160 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
29170 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
29180 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
29190 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
291a0 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
291b0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
291c0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
291d0 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
291e0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
291f0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
29200 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
29210 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
29220 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
29230 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
29240 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
29250 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
29260 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
29270 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
29280 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
29290 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
292a0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
292b0 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
292c0 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
292d0 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
292e0 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
292f0 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
29300 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
29310 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
29320 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
29330 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
29340 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
29350 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
29360 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
29370 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
29380 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
29390 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
293a0 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
293b0 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
293c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
293d0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43  _BKPT;.  }..  pC
293e0 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
293f0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
29400 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
29410 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
29420 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
29430 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
29440 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69  ValidOvfl);..  i
29450 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e  f( pRoot->nCell>
29460 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
29470 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
29480 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ALID;.  }else if
29490 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
294a0 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
294b0 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
294c0 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
294d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
294e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
294f0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
29500 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
29510 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
29520 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
29530 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
29540 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
29550 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
29560 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
29570 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
29580 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29590 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ALID;.  }.  retu
295a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
295b0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
295c0 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
295d0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
295e0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
295f0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
29600 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
29610 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
29620 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
29630 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
29640 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
29650 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
29660 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
29670 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
29680 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
29690 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
296a0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
296b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
296c0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
296d0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
296e0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
296f0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
29700 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29710 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29720 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
29730 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29740 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
29750 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29760 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
29770 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29780 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29790 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
297a0 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
297b0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
297c0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
297d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
297e0 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
297f0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
29800 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
29810 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29820 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29830 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
29840 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
29850 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
29860 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
29870 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
29880 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
29890 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
298a0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
298b0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
298c0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
298d0 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
298e0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
298f0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
29900 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
29910 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
29920 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
29930 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
29940 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
29950 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
29960 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
29970 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
29980 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
29990 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
299a0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
299b0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
299c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
299d0 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
299e0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
299f0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
29a00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29a10 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
29a20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
29a30 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29a40 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29a60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29a70 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
29a80 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
29a90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29aa0 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
29ab0 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
29ac0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
29ad0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
29ae0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
29af0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29b00 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
29b10 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
29b20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
29b30 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
29b40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29b50 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
29b60 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29b70 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
29b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29b90 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
29ba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
29bb0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
29bc0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
29bd0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
29be0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
29bf0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
29c00 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
29c10 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
29c20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
29c30 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
29c40 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
29c50 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
29c60 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
29c70 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
29c80 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
29c90 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
29ca0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
29cb0 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
29cc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29cd0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
29ce0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
29cf0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
29d00 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
29d10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29d20 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
29d30 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
29d40 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
29d50 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
29d60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29d70 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
29d80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29d90 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
29da0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
29db0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
29dc0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
29dd0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
29de0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
29df0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
29e00 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
29e10 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
29e20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
29e30 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
29e40 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
29e50 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
29e60 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
29e70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29e80 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
29e90 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
29ea0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
29eb0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
29ec0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
29ed0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
29ee0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
29ef0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
29f00 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
29f10 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
29f20 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
29f30 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
29f40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
29f50 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
29f60 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
29f70 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
29f80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29f90 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29fa0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29fb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29fc0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
29fd0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
29fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
29ff0 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
2a000 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
2a010 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
2a020 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
2a030 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2a040 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
2a050 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2a060 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
2a070 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2a080 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
2a090 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
2a0a0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
2a0b0 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
2a0c0 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
2a0d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
2a0e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
2a0f0 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
2a100 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
2a110 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
2a120 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
2a130 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2a140 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
2a150 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
2a160 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
2a170 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2a180 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2a190 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a1a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2a1b0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
2a1c0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2a1d0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
2a1e0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
2a1f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a200 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
2a210 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2a220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a230 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
2a240 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2a250 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2a260 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a270 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2a280 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2a290 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2a2a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2a2b0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
2a2c0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2a2d0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2a2e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2a2f0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2a300 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
2a310 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2a320 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
2a330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a340 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2a350 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
2a360 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Last;.      }els
2a370 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  e{.        pCur-
2a380 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2a390 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
2a3a0 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }.   .    }.  }
2a3b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a3c0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2a3d0 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
2a3e0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
2a3f0 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
2a400 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
2a410 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
2a420 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
2a430 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
2a440 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
2a450 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
2a460 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
2a470 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
2a480 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
2a490 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
2a4a0 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
2a4b0 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
2a4c0 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
2a4d0 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
2a4e0 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
2a4f0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2a500 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
2a510 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2a520 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2a530 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
2a540 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
2a550 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
2a560 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
2a570 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
2a580 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
2a590 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
2a5a0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
2a5b0 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
2a5c0 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
2a5d0 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
2a5e0 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
2a5f0 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
2a600 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
2a610 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
2a620 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
2a630 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
2a640 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
2a650 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
2a660 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2a670 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
2a680 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2a690 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2a6a0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2a6b0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2a6c0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
2a6d0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2a6e0 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
2a6f0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
2a700 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2a710 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
2a720 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
2a730 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
2a740 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
2a750 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
2a760 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2a770 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2a780 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2a7a0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
2a7b0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2a7c0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
2a7d0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2a7e0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2a7f0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2a800 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2a810 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
2a820 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2a830 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  xKey..**.** For 
2a840 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68  index tables, th
2a850 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65  e pIdxKey->eqSee
2a860 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74  n field is set t
2a870 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  o 1 if there.** 
2a880 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20  exists an entry 
2a890 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
2a8a0 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  t exactly matche
2a8b0 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a  s pIdxKey.  .*/.
2a8c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2a8d0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
2a8e0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2a8f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2a900 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
2a910 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
2a920 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
2a930 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
2a940 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
2a950 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
2a960 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
2a970 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
2a980 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
2a990 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
2a9a0 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
2a9b0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
2a9c0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
2a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9e0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
2a9f0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
2aa00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
2aa10 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
2aa20 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
2aa30 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2aa40 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2aa50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2aa60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2aa70 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2aa80 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
2aa90 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
2aaa0 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
2aab0 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
2aac0 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
2aad0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2aae0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
2aaf0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
2ab00 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
2ab10 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
2ab20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
2ab30 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
2ab40 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
2ab50 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ab60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2ab70 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2ab80 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2ab90 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43  Key)!=0.   && pC
2aba0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a 20  ur->curIntKey . 
2abb0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2abc0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2abd0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
2abe0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
2abf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ac00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
2ac10 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2ac20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2ac30 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
2ac40 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2ac50 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2ac60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ac70 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2ac80 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
2ac90 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
2aca0 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
2acb0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
2acc0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
2acd0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20  xKey->errCode = 
2ace0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
2acf0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2ad00 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
2ad10 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2ad20 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
2ad30 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2ad40 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
2ad50 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
2ad60 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2ad70 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
2ad80 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
2ad90 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
2ada0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2adb0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2adc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2add0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ade0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2adf0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ae00 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
2ae10 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2ae20 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2ae30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ae40 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
2ae50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ae60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2ae70 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
2ae80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ae90 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
2aea0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2aeb0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2aec0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
2aed0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
2aee0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2aef0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2af00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2af10 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2af20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2af30 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
2af40 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
2af50 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d  ]->intKey==pCur-
2af60 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
2af70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
2af80 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  rIntKey || pIdxK
2af90 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
2afa0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
2afb0 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50  r, idx, c;.    P
2afc0 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
2afd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2afe0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2aff0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2b000 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2b030 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
2b040 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
2b050 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
2b060 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
2b070 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
2b080 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
2b090 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
2b0a0 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
2b0b0 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
2b0c0 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
2b0d0 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
2b0e0 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
2b0f0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
2b100 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
2b110 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
2b120 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
2b130 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2b140 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
2b150 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
2b160 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
2b170 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
2b180 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
2b190 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
2b1a0 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
2b1b0 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
2b1c0 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
2b1d0 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
2b1e0 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
2b1f0 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
2b200 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2b210 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2b220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2b230 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
2b240 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
2b250 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
2b260 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
2b270 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  1;.    assert( b
2b280 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62  iasRight==0 || b
2b290 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20  iasRight==1 );. 
2b2a0 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31     idx = upr>>(1
2b2b0 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20  -biasRight); /* 
2b2c0 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20  idx = biasRight 
2b2d0 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72  ? upr : (lwr+upr
2b2e0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72  )/2; */.    pCur
2b2f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b300 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2b310 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64  .    if( xRecord
2b320 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20  Compare==0 ){.  
2b330 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2b340 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
2b350 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  y;.        pCell
2b360 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2b370 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2b380 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2b390 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
2b3a0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2b3b0 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c  ( 0x80 <= *(pCel
2b3c0 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l++) ){.        
2b3d0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
2b3e0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2b3f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b400 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b420 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
2b430 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
2b440 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
2b450 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
2b460 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2b470 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2b480 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
2b490 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2b4a0 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
2b4b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b4c0 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
2b4d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2b4e0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2b4f0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2b500 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
2b510 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2b520 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2b530 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
2b540 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
2b550 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2b560 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2b570 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
2b580 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
2b590 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2b5a0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2b5b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2b5c0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2b5d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2b5e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2b5f0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2b600 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2b610 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2b620 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2b630 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2b640 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2b650 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b660 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2b670 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2b680 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2b690 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2b6a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2b6b0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2b6c0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2b6d0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2b6e0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2b6f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2b700 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
2b710 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2b720 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
2b730 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
2b740 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2b750 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2b760 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2b770 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
2b780 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
2b790 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
2b7a0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
2b7b0 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
2b7c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2b7d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
2b7e0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
2b7f0 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
2b800 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
2b810 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
2b820 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
2b830 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
2b840 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
2b850 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
2b860 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
2b870 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
2b880 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
2b890 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
2b8a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2b8b0 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
2b8c0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
2b8d0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
2b8e0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
2b8f0 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
2b900 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
2b910 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
2b920 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
2b930 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
2b940 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
2b950 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
2b960 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
2b970 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
2b980 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
2b990 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
2b9a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
2b9b0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
2b9c0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
2b9d0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
2b9e0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
2b9f0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
2ba00 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2ba10 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
2ba20 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2ba30 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
2ba40 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
2ba50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2ba60 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2ba70 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
2ba80 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2ba90 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2baa0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2bab0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
2bac0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2bad0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
2bae0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
2baf0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
2bb00 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
2bb10 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
2bb20 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
2bb30 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
2bb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bb50 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2bb60 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
2bb70 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2bb80 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
2bb90 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
2bba0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
2bbb0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2bbc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2bbd0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
2bbe0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2bbf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2bc00 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2bc10 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2bc20 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
2bc30 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2bc40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2bc50 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
2bc60 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
2bc70 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
2bc80 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
2bc90 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
2bca0 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
2bcb0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
2bcc0 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
2bcd0 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
2bce0 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
2bcf0 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
2bd00 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
2bd10 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
2bd20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
2bd30 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
2bd40 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
2bd50 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
2bd60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2bd70 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
2bd80 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
2bd90 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
2bda0 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
2bdb0 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
2bdc0 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
2bdd0 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
2bde0 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
2bdf0 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
2be00 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
2be10 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
2be20 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
2be30 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
2be40 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2be50 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
2be60 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2be70 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
2be80 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
2be90 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
2bea0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
2beb0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
2bec0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2bed0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
2bee0 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
2bef0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
2bf00 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
2bf10 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
2bf20 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
2bf30 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
2bf40 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
2bf50 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
2bf60 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
2bf70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2bf80 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
2bf90 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2bfa0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
2bfb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2bfc0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
2bfd0 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2bfe0 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2bff0 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
2c000 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c010 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
2c020 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
2c030 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
2c040 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2c050 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20  Cell<2 ){.      
2c060 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c070 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2c080 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2c090 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2c0a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c0b0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
2c0c0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2c0d0 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20  nCell+18 );.    
2c0e0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
2c0f0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
2c100 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c110 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2c120 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2c130 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2c140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c150 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2c160 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2c170 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2c180 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
2c190 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
2c1a0 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
2c1b0 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32  har*)pCellKey, 2
2c1c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c1d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2c1e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c1f0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
2c200 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c210 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2c220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c230 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2c240 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
2c250 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
2c260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c270 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2c280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c290 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
2c2a0 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79          (pIdxKey
2c2b0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2c2c0 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d  E_CORRUPT || c==
2c2d0 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
2c2e0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2c2f0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  !=SQLITE_NOMEM |
2c300 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  | pCur->pBtree->
2c310 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c320 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2c330 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
2c340 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2c350 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx+1;.        }
2c360 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
2c370 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2c380 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
2c390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c3a0 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a  assert( c==0 );.
2c3b0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2c3c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
2c3d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c3e0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2c3f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c400 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2c410 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
2c420 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  Key->errCode ) r
2c430 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2c440 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
2c450 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2c460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c470 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2c480 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2c490 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2c4a0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2c4b0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2c4c0 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2c4d0 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
2c4e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
2c4f0 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
2c500 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
2c510 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2c520 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
2c530 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2c540 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2c550 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2c560 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2c570 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c580 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
2c590 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2c5a0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
2c5b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c5c0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2c5d0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
2c5e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2c5f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
2c600 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2c610 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
2c620 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
2c630 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
2c640 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
2c650 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2c660 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2c670 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2c680 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2c690 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2c6a0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2c6b0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
2c6c0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
2c6d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c6e0 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
2c6f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2c700 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
2c710 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
2c720 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
2c730 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
2c740 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c750 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c760 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2c770 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2c780 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  vfl);.  return r
2c790 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
2c7a0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2c7b0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
2c7c0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2c7d0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
2c7e0 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
2c7f0 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
2c800 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
2c810 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2c820 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
2c830 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2c840 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
2c850 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
2c860 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
2c870 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
2c880 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
2c890 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
2c8a0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2c8b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c8c0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
2c8d0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
2c8e0 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
2c8f0 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
2c900 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
2c910 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
2c920 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
2c930 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
2c940 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
2c950 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
2c960 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
2c970 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
2c980 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
2c990 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
2c9a0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
2c9b0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
2c9c0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
2c9d0 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
2c9e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
2c9f0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2ca00 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
2ca10 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
2ca20 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
2ca30 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
2ca40 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
2ca50 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2ca60 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ca70 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
2ca80 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
2ca90 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
2caa0 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
2cab0 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2cac0 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2cad0 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
2cae0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2caf0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2cb00 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2cb10 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
2cb20 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2cb30 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2cb40 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
2cb50 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
2cb60 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
2cb70 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
2cb80 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
2cb90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2cba0 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2cbb0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2cbc0 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2cbd0 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
2cbe0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2cbf0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2cc00 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
2cc10 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
2cc20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
2cc30 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
2cc40 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
2cc50 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
2cc60 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
2cc70 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2cc80 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
2cc90 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2cca0 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
2ccb0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
2ccc0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
2ccd0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
2cce0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
2ccf0 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
2cd00 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
2cd10 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
2cd20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
2cd30 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2cd40 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
2cd50 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
2cd60 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
2cd70 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
2cd80 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
2cd90 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
2cda0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
2cdb0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2cdc0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
2cdd0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
2cde0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
2cdf0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
2ce00 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
2ce10 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
2ce20 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2ce30 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
2ce40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2ce50 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2ce60 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
2ce70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2ce80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2ce90 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2cea0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ceb0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2cec0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2ced0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2cee0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2cef0 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66  *pRes==0 );.  if
2cf00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2cf10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2cf20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2cf30 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2cf40 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2cf50 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   );.    rc = res
2cf60 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2cf70 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2cf80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cf90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2cfa0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2cfb0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2cfc0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2cfd0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2cfe0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2cff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2d000 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2d010 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2d020 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d030 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d040 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2d050 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2d060 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2d070 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d080 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2d090 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2d0a0 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ext>0 ){.       
2d0b0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d0c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2d0d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2d0f0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2d100 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2d110 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d120 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d130 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2d140 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d150 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2d160 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2d170 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
2d180 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
2d190 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
2d1a0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
2d1b0 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
2d1c0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
2d1d0 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
2d1e0 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
2d1f0 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
2d200 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
2d210 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
2d220 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
2d230 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
2d240 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
2d250 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
2d260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2d270 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
2d280 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
2d290 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
2d2a0 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
2d2b0 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
2d2c0 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
2d2d0 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
2d2e0 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
2d2f0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
2d300 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
2d310 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d320 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2d330 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2d340 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2d350 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2d360 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
2d370 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d380 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
2d390 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2d3a0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
2d3b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2d3c0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2d3d0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2d3e0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2d3f0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2d400 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2d410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d430 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2d440 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
2d450 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d460 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2d470 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
2d480 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d490 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
2d4a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2d4b0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2d4c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2d4d0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
2d4e0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2d4f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d510 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2d520 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2d530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d550 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d560 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69  t(pCur);.  }.}.i
2d570 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
2d580 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2d590 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2d5a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d5b0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2d5c0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2d5d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2d5e0 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2d5f0 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2d600 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2d610 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2d620 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2d630 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2d640 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2d650 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d660 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2d670 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2d680 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2d690 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65  lidOvfl);.  *pRe
2d6a0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  s = 0;.  if( pCu
2d6b0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d6c0 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2d6d0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2d6e0 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20   pRes);.  pPage 
2d6f0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d700 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2d710 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64  f( (++pCur->aiId
2d720 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e  x[pCur->iPage])>
2d730 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2d740 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2d750 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2d760 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2d770 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2d780 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2d790 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d7a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d7b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2d7c0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2d7d0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2d7e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2d7f0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2d800 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2d810 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2d820 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2d830 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2d840 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2d850 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2d860 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2d870 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
2d880 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2d890 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2d8a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2d8b0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2d8c0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2d8d0 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2d8e0 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2d8f0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2d900 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  s().  That routi
2d910 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2d920 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2d930 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2d940 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   decrementing th
2d950 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2d960 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2d970 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2d980 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2d990 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2d9a0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72  (slower) btreePr
2d9b0 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70  evious().** help
2d9c0 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  er routine is ca
2d9d0 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2d9e0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2d9f0 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2da00 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72   page.** or to r
2da10 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2da20 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2da30 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2da40 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2da50 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2da60 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2da70 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2da80 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2da90 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2daa0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2dab0 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2dac0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2dad0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2dae0 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2daf0 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2db00 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2db10 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2db20 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2db30 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2db40 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2db50 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2db60 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2db70 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2db80 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2db90 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2dba0 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2dbb0 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2dbc0 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2dbd0 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2dbe0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2dbf0 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2dc00 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2dc10 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2dc20 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2dc30 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2dc40 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2dc50 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2dc60 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50  NLINE int btreeP
2dc70 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2dc80 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2dc90 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2dca0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2dcb0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2dcc0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2dcd0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2dce0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2dcf0 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
2dd00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2dd10 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2dd20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2dd30 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2dd40 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2dd50 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2dd60 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2dd70 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2dd80 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20  dNKey))==0 );.  
2dd90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2dda0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2ddb0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ddc0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ddd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  ){.    rc = rest
2dde0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2ddf0 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2de00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2de10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2de20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2de30 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2de40 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2de50 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2de60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2de70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2de80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2de90 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2dea0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2deb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2dec0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2ded0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2dee0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2def0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2df00 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2df10 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2df20 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt<0 ){.        
2df30 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2df40 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2df50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2df60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2df70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2df80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2df90 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2dfa0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2dfb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2dfc0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2dfd0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2dfe0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
2dff0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e000 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
2e010 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2e020 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
2e030 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
2e040 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
2e050 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2e060 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2e070 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2e080 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
2e090 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e0a0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
2e0b0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2e0c0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
2e0d0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2e0e0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2e0f0 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
2e100 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2e110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2e130 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2e140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2e150 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2e160 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2e170 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2e180 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2e190 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2e1a0 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
2e1b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2e1c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2e1d0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
2e1e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2e1f0 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
2e200 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2e210 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2e230 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2e240 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2e250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2e260 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2e270 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2e280 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
2e290 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2e2a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2e2b0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61   int *pRes){.  a
2e2c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2e2d0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2e2e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2e2f0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2e300 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2e310 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2e320 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2e330 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2e340 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2e350 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d  LID );.  *pRes =
2e360 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2e370 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2e380 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2e390 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2e3a0 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  Key);.  pCur->in
2e3b0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2e3c0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2e3d0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20  !=CURSOR_VALID. 
2e3e0 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78    || pCur->aiIdx
2e3f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2e400 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  .   || pCur->apP
2e410 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e420 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20  ->leaf==0.  ){. 
2e430 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
2e440 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
2e450 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  es);.  }.  pCur-
2e460 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e470 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  ge]--;.  return 
2e480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2e490 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
2e4a0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
2e4b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2e4c0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
2e4d0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
2e4e0 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
2e4f0 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
2e500 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
2e510 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2e520 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
2e530 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
2e540 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
2e550 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
2e560 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
2e570 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
2e580 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
2e590 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
2e5a0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2e5b0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
2e5c0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
2e5d0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2e5e0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
2e5f0 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
2e600 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
2e610 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
2e620 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69  rror.  *ppPage i
2e630 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e  s set to NULL in
2e640 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
2e650 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
2e660 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
2e670 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
2e680 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
2e690 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
2e6a0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
2e6b0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
2e6c0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
2e6d0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
2e6e0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
2e6f0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
2e700 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
2e710 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
2e720 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e730 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
2e740 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
2e750 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
2e760 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
2e770 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
2e780 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
2e790 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
2e7a0 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
2e7b0 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
2e7c0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2e7d0 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
2e7e0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
2e7f0 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
2e800 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
2e810 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
2e820 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
2e830 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
2e840 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
2e850 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
2e860 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
2e870 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
2e880 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
2e890 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
2e8a0 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
2e8b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2e8c0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
2e8d0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
2e8e0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
2e8f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
2e900 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
2e910 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
2e920 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
2e930 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2e940 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
2e950 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
2e960 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
2e970 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2e980 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
2e990 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
2e9a0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
2e9b0 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
2e9c0 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
2e9d0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2e9e0 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
2e9f0 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
2ea00 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
2ea10 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2ea20 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
2ea30 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
2ea40 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2ea50 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
2ea60 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
2ea70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
2ea80 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
2ea90 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2eaa0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2eab0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
2eac0 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
2ead0 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
2eae0 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
2eaf0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
2eb00 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2eb10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2eb20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2eb30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2eb40 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
2eb50 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
2eb60 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
2eb70 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
2eb80 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
2eb90 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2eba0 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
2ebb0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2ebc0 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
2ebd0 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33  OF: R-05119-0263
2ebe0 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  7 The 4-byte big
2ebf0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2ec00 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a  at offset 36.  *
2ec10 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20  * stores stores 
2ec20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2ec30 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2ec40 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20   freelist. */.  
2ec50 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
2ec60 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2ec70 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
2ec80 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
2ec90 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
2eca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ecb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ecc0 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
2ecd0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
2ece0 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
2ecf0 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
2ed00 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
2ed10 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
2ed20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
2ed30 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
2ed40 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
2ed50 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
2ed60 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
2ed70 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61   */.    u32 nSea
2ed80 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  rch = 0;   /* Co
2ed90 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
2eda0 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65  r of search atte
2edb0 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20  mpts */.    .   
2edc0 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
2edd0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
2ede0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
2edf0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
2ee00 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
2ee10 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2ee20 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
2ee30 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2ee40 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
2ee50 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
2ee60 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2ee70 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
2ee80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ee90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2eea0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2eeb0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
2eec0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
2eed0 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
2eee0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
2eef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
2ef00 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
2ef10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
2ef20 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
2ef30 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2ef40 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
2ef50 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
2ef60 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2ef70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2ef80 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
2ef90 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
2efa0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2efb0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
2efc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2efd0 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
2efe0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
2eff0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2f000 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
2f010 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
2f020 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
2f030 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
2f040 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
2f050 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
2f060 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
2f070 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
2f080 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
2f090 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
2f0a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f0b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2f0c0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2f0d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2f0e0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
2f0f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2f100 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
2f110 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
2f120 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
2f130 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
2f140 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
2f150 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
2f160 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
2f170 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
2f180 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
2f190 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
2f1a0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
2f1b0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
2f1c0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
2f1d0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2f1e0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
2f1f0 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
2f200 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
2f210 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2f220 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2f230 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
2f240 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
2f250 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
2f260 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
2f270 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2f280 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2f290 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
2f2a0 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
2f2b0 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
2f2c0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
2f2d0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
2f2e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2f2f0 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
2f300 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2f310 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
2f320 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
2f330 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
2f340 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2f350 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
2f360 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2f370 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2f380 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
2f390 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
2f3a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
2f3b0 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
2f3c0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
2f3d0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
2f3e0 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
2f3f0 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
2f400 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
2f410 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2f420 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
2f430 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
2f440 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
2f450 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
2f460 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
2f470 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2f480 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
2f490 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2f4a0 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
2f4b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
2f4c0 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
2f4d0 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
2f4e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2f4f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2f500 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f510 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2f520 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
2f530 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2f540 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
2f550 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2f560 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2f570 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
2f580 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f590 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
2f5a0 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
2f5b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
2f5c0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
2f5d0 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
2f5e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2f5f0 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
2f600 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
2f610 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
2f620 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
2f630 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
2f640 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
2f650 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
2f660 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
2f670 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2f680 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
2f690 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
2f6a0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
2f6b0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2f6c0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
2f6d0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
2f6e0 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
2f6f0 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
2f700 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
2f710 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
2f720 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
2f730 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
2f740 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
2f750 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
2f760 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
2f770 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
2f780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f790 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2f7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2f7b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f7c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2f7d0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2f7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
2f7f0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2f800 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2f810 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2f820 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2f830 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2f840 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
2f850 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
2f860 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
2f870 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2f880 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
2f890 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
2f8a0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
2f8b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2f8c0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
2f8d0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
2f8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
2f8f0 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
2f900 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
2f910 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
2f920 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2f930 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f940 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
2f950 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f960 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
2f970 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2f980 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
2f990 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a  if( searchList .
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2f9b0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c  nearby==iTrunk |
2f9c0 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79  | (iTrunk<nearby
2f9d0 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
2f9e0 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29  OC_LE)) .      )
2f9f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2fa00 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
2fa10 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
2fa20 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
2fa30 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
2fa40 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
2fa50 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2fa60 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
2fa70 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
2fa80 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2fa90 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2faa0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
2fab0 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
2fac0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2fad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2fae0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2faf0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2fb00 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2fb10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2fb20 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2fb30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fb40 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
2fb50 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2fb60 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2fb70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2fb80 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2fb90 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2fba0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2fbb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fbc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fbd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
2fbe0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
2fbf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2fc00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fc10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fc20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fc30 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2fc40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fc50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
2fc60 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2fc70 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
2fc80 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
2fc90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2fca0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2fcb0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
2fcc0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
2fcd0 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
2fce0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
2fcf0 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
2fd00 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
2fd10 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
2fd20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
2fd30 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
2fd40 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
2fd50 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
2fd60 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
2fd70 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
2fd80 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
2fd90 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
2fda0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2fdb0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
2fdc0 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
2fdd0 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
2fde0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2fdf0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fe00 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2fe10 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2fe20 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2fe30 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2fe40 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
2fe50 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2fe60 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2fe70 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
2fe80 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
2fe90 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
2fea0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2feb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fec0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2fed0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2fee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ff00 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
2ff10 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2ff20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2ff30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
2ff50 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
2ff60 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
2ff70 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2ff80 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2ff90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
2ffa0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
2ffb0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2ffc0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2ffd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
2ffe0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
2fff0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
30000 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
30010 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
30020 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
30030 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
30040 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
30050 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
30060 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
30070 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
30080 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
30090 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
300a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
300b0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
300c0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
300d0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
300e0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
300f0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
30100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30120 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
30130 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
30140 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30150 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
30160 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30170 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30180 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30190 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
301a0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
301b0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
301c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
301d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
301e0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
301f0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
30200 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
30210 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
30220 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
30230 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
30240 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
30250 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
30260 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
30270 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
30280 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
30290 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
302a0 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
302b0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
302c0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
302d0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
302e0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
302f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
30300 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
30310 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
30320 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
30330 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
30340 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
30350 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
30360 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
30370 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
30380 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
30390 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
303a0 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
303b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
303c0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
303d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
303e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
303f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30400 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
30410 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30420 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
30430 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
30440 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
30450 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
30460 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
30470 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
30480 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
30490 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
304a0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
304b0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
304c0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
304d0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
304e0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
304f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30500 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
30510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30520 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
30530 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
30560 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
30570 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
30580 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
30590 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
305a0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
305b0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
305c0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
305d0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
305e0 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
305f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
30600 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30610 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
30620 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30630 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30640 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
30650 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
30660 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
30670 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
30680 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
30690 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
306a0 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
306b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
306c0 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
306d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
306e0 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
306f0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
30700 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
30710 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
30720 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
30730 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
30740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30750 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
30760 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
30770 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
30780 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
30790 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
307a0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
307b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
307c0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
307d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
307e0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
307f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30800 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
30810 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
30820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
30830 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
30840 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
30850 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
30860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30870 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
30880 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
30890 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
308a0 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
308b0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
308c0 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  no)? PAGER_GET_N
308d0 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
308e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
308f0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
30900 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
30910 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
30920 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30940 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30950 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30960 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
30970 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30980 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
309a0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
309b0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
309c0 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61             *ppPa
309d0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
309e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
309f0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
30a00 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
30a10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30a20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30a30 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
30a40 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
30a50 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
30a60 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
30a70 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
30a80 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
30a90 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
30aa0 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
30ab0 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
30ac0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
30ad0 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
30ae0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
30af0 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
30b00 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
30b10 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
30b20 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
30b30 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
30b40 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
30b50 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
30b60 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
30b70 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
30b80 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
30b90 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
30ba0 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
30bb0 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
30bc0 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
30bd0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
30be0 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
30bf0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
30c00 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
30c10 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
30c20 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
30c30 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
30c40 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
30c50 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
30c60 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
30c70 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
30c80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
30c90 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
30ca0 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
30cb0 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
30cc0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
30cd0 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
30ce0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
30cf0 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
30d00 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
30d10 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
30d20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
30d30 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
30d40 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
30d50 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
30d60 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
30d70 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
30d80 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
30d90 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
30da0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
30db0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
30dc0 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
30dd0 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
30de0 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
30df0 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
30e00 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
30e10 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
30e20 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
30e30 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
30e40 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
30e50 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
30e60 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
30e70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30e80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
30e90 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
30ea0 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
30eb0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
30ec0 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
30ed0 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72  ONTENT:0;..    r
30ee0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30ef0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
30f00 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
30f10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30f20 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
30f30 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
30f40 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
30f50 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
30f60 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
30f70 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
30f80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30f90 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
30fa0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
30fb0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
30fc0 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
30fd0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
30fe0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
30ff0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
31000 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
31010 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
31020 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
31030 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
31040 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
31050 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
31060 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
31070 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
31080 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
31090 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
310a0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
310b0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
310c0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
310d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
310e0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
310f0 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
31100 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
31110 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
31120 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
31130 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
31140 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
31150 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
31160 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
31170 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20  Bt, pBt->nPage, 
31180 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  &pPg, bNoContent
31190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
311a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
311b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
311c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
311d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
311e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
311f0 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
31200 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31210 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42  urn rc;.      pB
31220 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
31230 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
31240 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
31250 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d  AGE(pBt) ){ pBt-
31260 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20  >nPage++; }.    
31270 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74  }.#endif.    put
31280 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29  4byte(28 + (u8*)
31290 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
312a0 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ta, pBt->nPage);
312b0 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42  .    *pPgno = pB
312c0 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61  t->nPage;..    a
312d0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
312e0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
312f0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
31300 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
31310 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
31320 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e  , ppPage, bNoCon
31330 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  tent);.    if( r
31340 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31360 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
31370 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
31380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
313a0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
313b0 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
313c0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
313d0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
313e0 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
313f0 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
31400 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
31410 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
31420 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
31430 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
31440 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
31450 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
31460 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
31470 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73  PrevTrunk);.  as
31480 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31490 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
314a0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
314b0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
314c0 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65  ge)<=1 );.  asse
314d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
314e0 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  K || (*ppPage)->
314f0 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
31500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31510 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31520 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
31530 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
31540 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31550 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
31560 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
31570 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
31580 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
31590 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
315a0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
315b0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
315c0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
315d0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
315e0 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
315f0 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
31600 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
31610 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
31620 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
31630 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
31640 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
31650 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
31660 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
31670 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
31680 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
31690 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
316a0 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
316b0 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
316c0 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
316d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
316e0 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
316f0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
31700 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
31710 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
31720 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
31730 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
31740 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
31750 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
31760 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
31770 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
31780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
31790 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
317a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
317b0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
317c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
317d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
317e0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
317f0 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
31800 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
31810 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
31820 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
31830 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
31840 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
31850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31860 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
31870 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
31880 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
31890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
318b0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
318c0 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318e0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
318f0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
31900 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
31910 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31920 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
31930 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
31940 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
31950 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a  B || iPage>1 );.
31960 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
31970 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
31980 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
31990 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29  .  if( iPage<2 )
319a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
319b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69  ORRUPT_BKPT;.  i
319c0 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
319d0 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
319e0 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
319f0 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
31a00 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
31a10 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
31a20 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
31a30 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
31a40 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
31a50 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
31a60 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
31a70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
31a80 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
31a90 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
31aa0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
31ab0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
31ac0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
31ad0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
31ae0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
31af0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
31b00 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
31b10 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
31b20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
31b30 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
31b40 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
31b50 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
31b60 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
31b70 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
31b80 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
31b90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
31ba0 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
31bb0 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
31bc0 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
31bd0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
31be0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
31bf0 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
31c00 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
31c10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31c20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31c30 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
31c40 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
31c50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
31c60 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
31c70 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
31c80 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
31c90 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
31ca0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
31cb0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
31cc0 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
31cd0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31ce0 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
31cf0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
31d00 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
31d10 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
31d20 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75   ){.    ptrmapPu
31d30 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
31d40 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
31d50 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
31d60 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
31d70 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
31d80 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
31d90 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
31da0 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
31db0 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
31dc0 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
31dd0 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
31de0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
31df0 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
31e00 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
31e10 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
31e20 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
31e30 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
31e40 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
31e50 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
31e60 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
31e70 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
31e80 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
31e90 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
31ea0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
31eb0 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
31ec0 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
31ed0 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
31ee0 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
31ef0 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
31f00 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
31f10 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
31f20 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
31f30 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  !=0 ){.    u32 n
31f40 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
31f50 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
31f60 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
31f70 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
31f80 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
31f90 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
31fa0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
31fb0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
31fc0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
31fd0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
31fe0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
31ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32000 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32010 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
32020 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
32030 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
32040 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
32050 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e  pBt->usableSize>
32060 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  32 );.    if( nL
32070 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e  eaf > (u32)pBt->
32080 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
32090 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
320a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
320b0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
320c0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
320d0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
320e0 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   < (u32)pBt->usa
320f0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
32100 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
32110 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
32120 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
32130 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
32140 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
32150 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
32160 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
32170 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
32180 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
32190 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
321a0 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
321b0 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
321c0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
321d0 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
321e0 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
321f0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
32200 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
32210 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
32220 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
32230 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
32240 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
32250 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
32260 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
32270 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
32280 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
32290 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
322a0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
322b0 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
322c0 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
322d0 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
322e0 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
322f0 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
32300 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
32310 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
32320 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
32330 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
32340 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72  ontinue to restr
32350 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
32360 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
32370 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
32380 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
32390 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
323a0 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
323b0 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
323c0 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
323d0 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
323e0 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
323f0 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
32400 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
32410 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
32420 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
32430 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
32440 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
32450 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  8"..      **.   
32460 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
32470 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36  F: R-19920-11576
32480 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20   However, newer 
32490 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
324a0 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a  te still.      *
324b0 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68  * avoid using th
324c0 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69  e last six entri
324d0 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69  es in the freeli
324e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72  st trunk page ar
324f0 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ray in.      ** 
32500 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62  order that datab
32510 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65  ase files create
32520 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
32530 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61  ons of SQLite ca
32540 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65  n be.      ** re
32550 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ad by older vers
32560 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a  ions of SQLite..
32570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
32580 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32590 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
325a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
325b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
325c0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
325d0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
325e0 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
325f0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
32600 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
32610 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
32620 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
32630 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
32640 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
32650 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
32660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32670 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
32680 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
32690 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
326a0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
326b0 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
326c0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
326d0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
326e0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
326f0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
32700 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
32710 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
32720 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
32730 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32740 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
32750 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
32760 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
32770 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
32780 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
32790 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
327a0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
327b0 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
327c0 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
327d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
327e0 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
327f0 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
32800 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
32810 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
32820 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
32830 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
32840 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
32850 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
32860 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
32870 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
32880 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
32890 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
328a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
328b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
328c0 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
328d0 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
328e0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
328f0 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
32900 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
32910 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
32920 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32930 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
32940 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
32950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
32960 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32970 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
32980 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
32990 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
329a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
329b0 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
329c0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
329d0 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
329e0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
329f0 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
32a00 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
32a10 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
32a20 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
32a30 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
32a40 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
32a50 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
32a60 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
32a70 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
32a80 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
32a90 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
32aa0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
32ab0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
32ac0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
32ad0 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
32ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32af0 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
32b00 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
32b10 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
32b20 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
32b30 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
32b40 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
32b50 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
32b60 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65  ven Cell.  Write
32b70 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65   the.** local Ce
32b80 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d  ll size (the num
32b90 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20  ber of bytes on 
32ba0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
32bb0 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f  e, omitting.** o
32bc0 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70  verflow) into *p
32bd0 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  nSize..*/.static
32be0 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a   int clearCell(.
32bf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32c00 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
32c10 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
32c20 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f  ains the Cell */
32c30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
32c40 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46   *pCell,    /* F
32c50 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
32c60 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a   Cell */.  u16 *
32c70 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
32c80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
32c90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c   size of the Cel
32ca0 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42  l here */.){.  B
32cb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32cc0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
32cd0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
32ce0 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
32cf0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
32d00 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61  fl;.  u32 ovflPa
32d10 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
32d20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
32d30 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
32d40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
32d50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
32d60 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
32d70 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20  nfo);.  *pnSize 
32d80 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
32d90 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3d  if( info.nLocal=
32da0 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
32db0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32dc0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
32dd0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
32de0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
32df0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
32e00 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
32e10 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 20 3e 20 70  info.nSize-1 > p
32e20 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
32e30 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20  e->maskPage ){. 
32e40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32e50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20  _CORRUPT_BKPT;  
32e60 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
32e70 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
32e80 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
32e90 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
32ea0 65 6c 6c 20 2b 20 69 6e 66 6f 2e 6e 53 69 7a 65  ell + info.nSize
32eb0 20 2d 20 34 29 3b 0a 20 20 61 73 73 65 72 74 28   - 4);.  assert(
32ec0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
32ed0 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
32ee0 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
32ef0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
32f00 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
32f10 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
32f20 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
32f30 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
32f40 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
32f50 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20   nOvfl>0 || .   
32f60 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20   (CORRUPT_DB && 
32f70 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b  (info.nPayload +
32f80 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f   ovflPageSize)<o
32f90 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29  vflPageSize).  )
32fa0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
32fb0 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
32fc0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
32fd0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
32fe0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
32ff0 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
33000 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
33010 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
33020 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
33030 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
33040 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
33050 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
33060 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
33070 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
33080 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
33090 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
330a0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
330b0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
330c0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
330d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
330e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
330f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
33100 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
33110 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
33120 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
33130 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
33140 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
33150 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33160 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
33170 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
33180 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
33190 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
331a0 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
331b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
331c0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
331d0 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
331e0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
331f0 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
33200 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
33210 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
33220 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
33230 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
33240 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
33250 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
33260 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
33270 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
33280 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
33290 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
332a0 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
332b0 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
332c0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
332d0 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
332e0 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
332f0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
33300 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
33310 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
33320 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
33330 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
33340 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
33350 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
33360 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
33370 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
33380 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
33390 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
333a0 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
333b0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
333c0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
333d0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
333e0 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
333f0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
33400 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
33410 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
33420 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
33430 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
33440 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
33450 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
33460 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
33470 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
33480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
33490 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
334a0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
334b0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
334c0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
334d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
334e0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
334f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
33500 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
33510 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
33520 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
33530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33540 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
33550 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
33560 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
33570 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
33580 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
33590 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
335a0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
335b0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
335c0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
335d0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
335e0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
335f0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
33600 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
33610 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
33620 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
33630 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
33640 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
33650 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
33660 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
33670 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
33680 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
33690 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
336a0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
336b0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
336c0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
336d0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
336e0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
336f0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
33700 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
33710 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
33720 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
33730 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
33740 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
33750 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
33760 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
33770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33780 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
33790 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
337a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
337b0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
337c0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
337d0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
337e0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
337f0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
33800 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
33810 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
33820 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
33830 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
33840 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
33850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33860 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
33870 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
33880 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
33890 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
338a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338b0 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
338c0 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
338d0 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
338e0 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
338f0 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
33900 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
33910 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
33920 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
33930 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
33940 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
33950 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
33960 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
33970 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
33980 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
33990 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
339a0 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
339b0 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
339c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
339d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
339e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
339f0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
33a00 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
33a10 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
33a20 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
33a30 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
33a40 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
33a50 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
33a60 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
33a70 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
33a80 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
33a90 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
33aa0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
33ab0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
33ac0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
33ad0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
33ae0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
33af0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
33b00 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
33b10 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70  */.  nHeader = p
33b20 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
33b30 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
33b40 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
33b50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
33b60 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e  KeyLeaf ){.    n
33b70 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
33b80 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
33b90 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
33ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
33bb0 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20  ssert( nData==0 
33bc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
33bd0 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  Zero==0 );.  }. 
33be0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
33bf0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
33c00 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
33c10 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  Key);.  .  /* Fi
33c20 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
33c30 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20  d size */.  if( 
33c40 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
33c50 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
33c60 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
33c70 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
33c80 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
33c90 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d    assert( nKey<=
33ca0 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70 4b  0x7fffffff && pK
33cb0 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50 61  ey!=0 );.    nPa
33cc0 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65  yload = (int)nKe
33cd0 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
33ce0 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
33cf0 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
33d00 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
33d10 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
33d20 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
33d30 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
33d40 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
33d50 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
33d60 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
33d70 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
33d80 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
33d90 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
33da0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72  Payload;.    pPr
33db0 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d  ior = pCell;.  }
33dc0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e  else{.    int mn
33dd0 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
33de0 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b  al;.    n = mn +
33df0 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
33e00 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
33e10 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
33e20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
33e30 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
33e40 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
33e50 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
33e60 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
33e70 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
33e80 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
33e90 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
33ea0 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   n;.    *pnSize 
33eb0 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20  = n + nHeader + 
33ec0 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  4;.    pPrior = 
33ed0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e  &pCell[nHeader+n
33ee0 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61  ];.  }.  pPayloa
33ef0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
33f00 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  er];..  /* At th
33f10 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c  is point variabl
33f20 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  es should be set
33f30 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
33f40 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61  *.  **   nPayloa
33f50 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61  d           Tota
33f60 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69  l payload size i
33f70 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70  n bytes.  **   p
33f80 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
33f90 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20    Begin writing 
33fa0 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a  payload here.  *
33fb0 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20  *   spaceLeft   
33fc0 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61         Space ava
33fd0 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f  ilable at pPaylo
33fe0 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64  ad.  If nPayload
33ff0 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a  >spaceLeft,.  **
34000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34010 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73        that means
34020 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70   content must sp
34030 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill into overflo
34040 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20  w pages..  **   
34050 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
34060 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c     Size of the l
34070 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63  ocal cell (not c
34080 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77  ounting overflow
34090 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70   pages).  **   p
340a0 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
340b0 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65    Where to write
340c0 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65   the pgno of the
340d0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
340e0 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  page.  **.  ** U
340f0 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72  se a call to btr
34100 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
34110 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
34120 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65  the values above
34130 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75  .  ** were compu
34140 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
34150 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44   */.#if SQLITE_D
34160 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
34170 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
34180 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
34190 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
341a0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
341b0 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e  rt( nHeader==(in
341c0 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
341d0 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
341e0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
341f0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ey==nKey );.    
34200 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
34210 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
34220 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
34230 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
34240 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  Local );.  }.#en
34250 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
34260 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
34270 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
34280 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
34290 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
342a0 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
342b0 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
342c0 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
342d0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
342e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
342f0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
34300 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
34310 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
34320 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
34330 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
34340 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
34350 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
34360 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
34370 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
34380 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
34390 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
343a0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
343b0 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
343c0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
343d0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
343e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
343f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
34400 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
34410 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
34420 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
34430 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
34440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34450 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
34460 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
34470 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
34480 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
34490 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
344a0 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
344b0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
344c0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
344d0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
344e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
344f0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
34500 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
34510 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
34520 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
34530 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
34540 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
34550 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
34560 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
34570 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
34580 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
34590 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
345a0 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
345b0 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
345c0 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
345d0 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
345e0 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
345f0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
34600 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
34610 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
34620 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
34630 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
34640 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
34650 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
34660 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
34670 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
34680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34690 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
346a0 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
346b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
346c0 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
346d0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
346e0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
346f0 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
34700 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
34710 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
34720 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
34730 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
34740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34750 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
34760 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
34770 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
34780 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
34790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
347a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
347b0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
347c0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
347d0 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
347e0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
347f0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
34800 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
34810 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
34820 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
34830 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
34840 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
34850 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34860 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
34870 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
34880 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
34890 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
348a0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
348b0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
348c0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
348d0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
348e0 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
348f0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
34900 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
34910 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
34920 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
34930 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
34940 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
34950 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34960 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34970 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
34980 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
34990 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
349a0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
349b0 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
349c0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
349d0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
349e0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
349f0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
34a00 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
34a10 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
34a20 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
34a30 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
34a40 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
34a50 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
34a60 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
34a70 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
34a80 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
34a90 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
34aa0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
34ab0 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
34ac0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
34ad0 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
34ae0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
34af0 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
34b00 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34b10 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
34b20 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
34b30 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
34b40 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
34b50 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
34b60 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
34b70 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
34b80 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
34b90 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
34ba0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
34bb0 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
34bc0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
34bd0 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
34be0 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
34bf0 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
34c00 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
34c10 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
34c20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
34c30 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34c40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34c50 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
34c60 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
34c70 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
34c80 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
34c90 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
34ca0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
34cb0 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
34cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
34cd0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
34ce0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
34cf0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
34d00 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
34d10 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
34d20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
34d30 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
34d40 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
34d50 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
34d60 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
34d70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
34d80 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
34d90 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
34da0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
34db0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
34dc0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
34dd0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
34de0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
34df0 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
34e00 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
34e10 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
34e20 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
34e30 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
34e40 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
34e50 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
34e60 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
34e70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
34e80 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
34e90 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
34ea0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
34eb0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
34ec0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
34ed0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
34ee0 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
34ef0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
34f00 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
34f10 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
34f20 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
34f30 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
34f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
34f50 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
34f60 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
34f70 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
34f80 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
34f90 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
34fa0 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
34fb0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
34fc0 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
34fd0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
34fe0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
34ff0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
35000 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
35010 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
35020 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
35030 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
35040 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
35050 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
35060 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
35070 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
35080 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
35090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
350a0 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d  RRUPT_DB || sz==
350b0 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
350c0 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
350d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
350e0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
350f0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
35100 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
35110 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
35120 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
35130 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
35140 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
35150 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
35160 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
35170 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
35180 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
35190 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
351a0 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
351b0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
351c0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
351d0 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
351e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
351f0 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
35200 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
35210 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
35220 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
35230 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
35240 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
35250 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
35260 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
35270 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
35280 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
35290 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
352a0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
352b0 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
352c0 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  nCell--;.  if( p
352d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
352e0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
352f0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
35300 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
35310 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62  ] = 0;.    put2b
35320 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
35330 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
35340 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  ableSize);.    p
35350 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
35360 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
35370 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64  Size - pPage->hd
35380 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  rOffset.        
35390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
353a0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
353b0 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73  Size - 8;.  }els
353c0 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  e{.    memmove(p
353d0 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
353e0 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
353f0 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ));.    put2byte
35400 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
35410 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
35420 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
35430 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 2;.  }.}../*.*
35440 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
35450 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
35460 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
35470 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
35480 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
35490 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
354a0 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
354b0 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
354c0 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
354d0 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
354e0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
354f0 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
35500 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
35510 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
35520 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
35530 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
35540 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
35550 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
35560 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
35570 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
35580 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
35590 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
355a0 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
355b0 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
355c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
355d0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
355e0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
355f0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
35600 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
35610 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
35620 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
35630 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
35640 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a  incremented..*/.
35650 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
35660 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
35670 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
35680 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
35690 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
356a0 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
356b0 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
356c0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
356d0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
356e0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
356f0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
35700 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
35710 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
35720 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
35730 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
35740 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
35750 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
35760 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
35770 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
35780 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
35790 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
357a0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
357b0 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
357c0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
357d0 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
357e0 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
357f0 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
35800 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
35810 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
35820 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
35830 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
35840 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
35850 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
35860 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
35870 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
35880 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  nter */.  u8 *da
35890 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
358a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
358b0 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
358c0 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20    u8 *pIns;     
358d0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
358e0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
358f0 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63  Idx[] where no c
35900 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ell inserted */.
35910 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
35920 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
35930 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
35940 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
35950 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
35960 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70  ssert( MX_CELL(p
35970 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
35980 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
35990 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
359a0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
359b0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
359c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
359d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
359e0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
359f0 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
35a00 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
35a10 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
35a20 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
35a30 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
35a40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35a50 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
35a60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
35a70 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
35a80 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
35a90 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
35aa0 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
35ab0 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
35ac0 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
35ad0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
35ae0 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
35af0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
35b00 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
35b10 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
35b20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
35b30 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
35b40 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
35b50 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
35b60 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
35b70 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
35b80 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
35b90 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
35ba0 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
35bb0 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
35bc0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
35bd0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
35be0 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  z==pPage->xCellS
35bf0 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ize(pPage, pCell
35c00 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
35c10 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
35c20 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
35c30 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
35c40 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
35c50 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
35c60 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
35c70 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
35c80 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
35c90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
35ca0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
35cb0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
35cc0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
35cd0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
35ce0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
35cf0 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
35d00 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
35d10 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
35d20 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
35d30 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
35d40 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
35d50 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
35d60 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20  [j] = (u16)i;.. 
35d70 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69     /* When multi
35d80 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63  ple overflows oc
35d90 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c  cur, they are al
35da0 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20  ways sequential 
35db0 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f  and in.    ** so
35dc0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69  rted order.  Thi
35dd0 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69  s invariants ari
35de0 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69  se because multi
35df0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61  ple overflows ca
35e00 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63  n.    ** only oc
35e10 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69  cur when inserti
35e20 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ng divider cells
35e30 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
35e40 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20   page during.   
35e50 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61   ** balancing, a
35e60 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20  nd the dividers 
35e70 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64  are adjacent and
35e80 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   sorted..    */.
35e90 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
35ea0 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66   || pPage->aiOvf
35eb0 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b  l[j-1]<(u16)i );
35ec0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e   /* Overflows in
35ed0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f   sorted order */
35ee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
35ef0 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61  0 || i==pPage->a
35f00 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20  iOvfl[j-1]+1 ); 
35f10 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61    /* Overflows a
35f20 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f  re sequential */
35f30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
35f40 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
35f50 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
35f60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
35f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35f80 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
35f90 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
35fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
35fb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
35fc0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
35fd0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
35fe0 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
35ff0 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >aData;.    asse
36000 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d  rt( &data[pPage-
36010 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50  >cellOffset]==pP
36020 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b  age->aCellIdx );
36030 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
36040 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
36050 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
36060 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
36070 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
36080 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
36090 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
360a0 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
360b0 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74  ollowing propert
360c0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
360d0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
360e0 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73  fully */.    ass
360f0 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b  ert( idx >= 0 );
36100 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
36110 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f   >= pPage->cellO
36120 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
36130 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50  Cell+2 || CORRUP
36140 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  T_DB );.    asse
36150 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
36160 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
36170 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
36180 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
36190 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
361a0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
361b0 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a  [idx], pCell, sz
361c0 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
361d0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
361e0 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
361f0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
36200 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d     pIns = pPage-
36210 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b  >aCellIdx + i*2;
36220 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e  .    memmove(pIn
36230 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50  s+2, pIns, 2*(pP
36240 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29  age->nCell - i))
36250 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
36260 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  Ins, idx);.    p
36270 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
36280 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20     /* increment 
36290 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a  the cell count *
362a0 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74  /.    if( (++dat
362b0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
362c0 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61  et+4])==0 ) data
362d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
362e0 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65  t+3]++;.    asse
362f0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
36300 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
36310 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+3])==pPage->
36320 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66  nCell );.#ifndef
36330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36340 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
36350 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
36360 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
36370 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
36380 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
36390 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
363a0 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
363b0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
363c0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
363d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
363e0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
363f0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
36400 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
36410 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
36420 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e   pRC);.    }.#en
36430 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
36440 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a   A CellArray obj
36450 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  ect contains a c
36460 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73  ache of pointers
36470 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61   and sizes for a
36480 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20  .** consecutive 
36490 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c  sequence of cell
364a0 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  s that might be 
364b0 68 65 6c 64 20 6d 75 6c 74 69 70 6c 65 20 70 61  held multiple pa
364c0 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ges..*/.typedef 
364d0 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
364e0 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75   CellArray;.stru
364f0 63 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20  ct CellArray {. 
36500 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
36510 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
36520 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
36530 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  pCell[] */.  Mem
36540 50 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20  Page *pRef;     
36550 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
36560 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
36570 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *apCell;        
36580 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
36590 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
365a0 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
365b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
365c0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
365d0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
365e0 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  l[] */.};../*.**
365f0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
36600 65 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78  ell sizes at idx
36610 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64  , idx+1, ..., id
36620 78 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a  x+N-1 have been.
36630 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a  ** computed..*/.
36640 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75  static void popu
36650 6c 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65  lateCellCache(Ce
36660 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
36670 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61  idx, int N){.  a
36680 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
36690 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c   idx+N<=p->nCell
366a0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30   );.  while( N>0
366b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
366c0 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d  p->apCell[idx]!=
366d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
366e0 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29  szCell[idx]==0 )
366f0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c  {.      p->szCel
36700 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66  l[idx] = p->pRef
36710 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70  ->xCellSize(p->p
36720 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69  Ref, p->apCell[i
36730 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  dx]);.    }else{
36740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43  .      assert( C
36750 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20  ORRUPT_DB ||.   
36760 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a             p->sz
36770 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52  Cell[idx]==p->pR
36780 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
36790 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
367a0 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a  [idx]) );.    }.
367b0 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e      idx++;.    N
367c0 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  --;.  }.}../*.**
367d0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
367e0 20 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d   of the Nth elem
367f0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ent of the cell 
36800 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20  array.*/.static 
36810 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
36820 75 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53  u16 computeCellS
36830 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  ize(CellArray *p
36840 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
36850 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d  rt( N>=0 && N<p-
36860 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
36870 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  rt( p->szCell[N]
36880 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65  ==0 );.  p->szCe
36890 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d  ll[N] = p->pRef-
368a0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
368b0 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d  ef, p->apCell[N]
368c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73  );.  return p->s
368d0 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74  zCell[N];.}.stat
368e0 69 63 20 75 31 36 20 63 61 63 68 65 64 43 65 6c  ic u16 cachedCel
368f0 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20  lSize(CellArray 
36900 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  *p, int N){.  as
36910 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c  sert( N>=0 && N<
36920 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  p->nCell );.  if
36930 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29  ( p->szCell[N] )
36940 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
36950 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63  l[N];.  return c
36960 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70  omputeCellSize(p
36970 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , N);.}../*.** A
36980 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
36990 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
369a0 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20  to nCell b-tree 
369b0 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20  page cells. The 
369c0 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72  .** szCell[] arr
369d0 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ay contains the 
369e0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
369f0 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   each cell. This
36a00 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70   function.** rep
36a10 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e  laces the curren
36a20 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  t contents of pa
36a30 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20  ge pPg with the 
36a40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
36a50 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a  cell.** array..*
36a60 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65  *.** Some of the
36a70 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
36a80 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  [] may currently
36a90 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
36aa0 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  g. This.** funct
36ab0 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64  ion works around
36ac0 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
36ad0 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69   by this by maki
36ae0 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79  ng a copy of any
36af0 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20   .** such cells 
36b00 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
36b10 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ng the page data
36b20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50  ..**.** The MemP
36b30 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20  age.nFree field 
36b40 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  is invalidated b
36b50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
36b60 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
36b70 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
36b80 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73   the caller to s
36b90 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e  et it correctly.
36ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
36bb0 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65  ebuildPage(.  Me
36bc0 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
36bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36be0 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20   Edit this page 
36bf0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
36c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c10 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
36c20 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
36c30 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
36c40 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
36c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
36c60 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
36c70 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
36c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c90 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
36ca0 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
36cb0 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
36cc0 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
36cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
36ce0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
36cf0 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63   pPg */.  u8 * c
36d00 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
36d10 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
36d20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
36d30 20 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f   data for pPg */
36d40 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61  .  const int usa
36d50 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
36d60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
36d70 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e    u8 * const pEn
36d80 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c  d = &aData[usabl
36d90 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b  eSize];.  int i;
36da0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20  .  u8 *pCellptr 
36db0 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
36dc0 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
36dd0 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
36de0 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
36df0 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61  ager);.  u8 *pDa
36e00 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62  ta;..  i = get2b
36e10 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
36e20 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54  ]);.  memcpy(&pT
36e30 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d  mp[i], &aData[i]
36e40 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69  , usableSize - i
36e50 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45  );..  pData = pE
36e60 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nd;.  for(i=0; i
36e70 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
36e80 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70    u8 *pCell = ap
36e90 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
36ea0 20 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70   SQLITE_WITHIN(p
36eb0 43 65 6c 6c 2c 61 44 61 74 61 2c 70 45 6e 64 29  Cell,aData,pEnd)
36ec0 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   ){.      pCell 
36ed0 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20  = &pTmp[pCell - 
36ee0 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20  aData];.    }.  
36ef0 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c    pData -= szCel
36f00 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79  l[i];.    put2by
36f10 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44  te(pCellptr, (pD
36f20 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20  ata - aData));. 
36f30 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32     pCellptr += 2
36f40 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20  ;.    if( pData 
36f50 3c 20 70 43 65 6c 6c 70 74 72 20 29 20 72 65 74  < pCellptr ) ret
36f60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
36f70 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d  PT_BKPT;.    mem
36f80 63 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c  cpy(pData, pCell
36f90 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , szCell[i]);.  
36fa0 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c    assert( szCell
36fb0 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]==pPg->xCellS
36fc0 69 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c 29 20  ize(pPg, pCell) 
36fd0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
36fe0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
36ff0 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78  zCell[i]!=pPg->x
37000 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43 65  CellSize(pPg,pCe
37010 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ll) );.  }..  /*
37020 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20   The pPg->nFree 
37030 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74  field is now set
37040 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68   incorrectly. Th
37050 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69  e caller will fi
37060 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e  x it. */.  pPg->
37070 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20  nCell = nCell;. 
37080 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20   pPg->nOverflow 
37090 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65  = 0;..  put2byte
370a0 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20  (&aData[hdr+1], 
370b0 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  0);.  put2byte(&
370c0 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  aData[hdr+3], pP
370d0 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  g->nCell);.  put
370e0 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
370f0 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61  +5], pData - aDa
37100 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72  ta);.  aData[hdr
37110 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72 65  +7] = 0x00;.  re
37120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37130 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
37140 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
37150 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20   nCell pointers 
37160 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e  to b-tree cells.
37170 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a   Array szCell.**
37180 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
37190 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
371a0 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54  ach such cell. T
371b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
371c0 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64  empts to .** add
371d0 20 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65   the cells store
371e0 64 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74  d in the array t
371f0 6f 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 69  o page pPg. If i
37200 74 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73  t cannot (becaus
37210 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  e .** the page n
37220 65 65 64 73 20 74 6f 20 62 65 20 64 65 66 72 61  eeds to be defra
37230 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74  gmented before t
37240 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69  he cells will fi
37250 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20  t), non-zero.** 
37260 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
37270 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
37280 65 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20 73  ells are added s
37290 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72  uccessfully, zer
372a0 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  o is.** returned
372b0 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
372c0 20 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73   pCellptr points
372d0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
372e0 74 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d  try in the cell-
372f0 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a  pointer array.**
37300 20 28 70 61 72 74 20 6f 66 20 70 61 67 65 20 70   (part of page p
37310 50 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e  Pg) to populate.
37320 20 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65   After cell apCe
37330 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e  ll[0] is written
37340 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   to the.** page 
37350 62 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f  body, a 16-bit o
37360 66 66 73 65 74 20 69 73 20 77 72 69 74 74 65 6e  ffset is written
37370 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e   to pCellptr. An
37380 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63  d so on, for eac
37390 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65  h.** cell in the
373a0 20 61 72 72 61 79 2e 20 49 74 20 69 73 20 74 68   array. It is th
373b0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
373c0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
373d0 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74  o ensure.** that
373e0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
373f0 76 65 72 77 72 69 74 65 20 74 68 69 73 20 70 61  verwrite this pa
37400 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70  rt of the cell-p
37410 6f 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a  ointer array..**
37420 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
37430 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
37440 2c 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73  , *ppData points
37450 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
37460 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
37470 20 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50   area on page pP
37480 67 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  g. If the size o
37490 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72  f the content ar
374a0 65 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a  ea is extended,.
374b0 2a 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75 70  ** *ppData is up
374c0 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  dated to point t
374d0 6f 20 74 68 65 20 6e 65 77 20 73 74 61 72 74 20  o the new start 
374e0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  of the content a
374f0 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  rea.** before re
37500 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46  turning..**.** F
37510 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74  inally, argument
37520 20 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74   pBegin points t
37530 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64  o the byte immed
37540 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
37550 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
37560 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
37570 64 20 62 79 20 74 68 69 73 20 70 61 67 65 20 66  d by this page f
37580 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  or the cell-poin
37590 74 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a  ter area (for.**
375a0 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74   all cells - not
375b0 20 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65   just those inse
375c0 72 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72  rted by the curr
375d0 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68  ent call). If th
375e0 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65  e content.** are
375f0 61 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64  a must be extend
37600 65 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69  ed to before thi
37610 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
37620 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61   to accomodate a
37630 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61  ll.** cells in a
37640 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68  pCell[], then th
37650 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66  e cells do not f
37660 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  it and non-zero 
37670 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
37680 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
37690 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65  nsertArray(.  Me
376a0 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
376b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
376c0 20 50 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c   Page to add cel
376d0 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70  ls to */.  u8 *p
376e0 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20  Begin,          
376f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
37700 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65  d of cell-pointe
37710 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20  r array */.  u8 
37720 2a 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20 20  **ppData,       
37730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37740 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e  IN/OUT: Page con
37750 74 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74  tent -area point
37760 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
37770 6c 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  lptr,           
37780 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
37790 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74  er to cell-point
377a0 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  er area */.  int
377b0 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20   iFirst,        
377c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
377d0 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
377e0 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  ell to add */.  
377f0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
37800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37810 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
37820 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67  ls to add to pPg
37830 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20   */.  CellArray 
37840 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20  *pCArray        
37850 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37860 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  f cells */.){.  
37870 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61  int i;.  u8 *aDa
37880 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
37890 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a  .  u8 *pData = *
378a0 70 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 45  ppData;.  int iE
378b0 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43  nd = iFirst + nC
378c0 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ell;.  assert( C
378d0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67  ORRUPT_DB || pPg
378e0 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
378f0 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  ;    /* Never ca
37900 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a  lled on page 1 *
37910 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74  /.  for(i=iFirst
37920 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a  ; i<iEnd; i++){.
37930 20 20 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a      int sz, rc;.
37940 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20      u8 *pSlot;. 
37950 20 20 20 73 7a 20 3d 20 63 61 63 68 65 64 43 65     sz = cachedCe
37960 6c 6c 53 69 7a 65 28 70 43 41 72 72 61 79 2c 20  llSize(pCArray, 
37970 69 29 3b 0a 20 20 20 20 69 66 28 20 28 61 44 61  i);.    if( (aDa
37980 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61 74  ta[1]==0 && aDat
37990 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28 70 53 6c  a[2]==0) || (pSl
379a0 6f 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ot = pageFindSlo
379b0 74 28 70 50 67 2c 73 7a 2c 26 72 63 29 29 3d 3d  t(pPg,sz,&rc))==
379c0 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61  0 ){.      pData
379d0 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69 66   -= sz;.      if
379e0 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29  ( pData<pBegin )
379f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
37a00 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a   pSlot = pData;.
37a10 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 70 53 6c      }.    /* pSl
37a20 6f 74 20 61 6e 64 20 70 43 41 72 72 61 79 2d 3e  ot and pCArray->
37a30 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20 6e  apCell[i] will n
37a40 65 76 65 72 20 6f 76 65 72 6c 61 70 20 6f 6e 20  ever overlap on 
37a50 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20 20  a well-formed.  
37a60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20    ** database.  
37a70 42 75 74 20 74 68 65 79 20 6d 69 67 68 74 20 66  But they might f
37a80 6f 72 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  or a corrupt dat
37a90 61 62 61 73 65 2e 20 20 48 65 6e 63 65 20 75 73  abase.  Hence us
37aa0 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20 20 20 20  e memmove().    
37ab0 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63 70 79 28  ** since memcpy(
37ac0 29 20 73 65 6e 64 73 20 53 49 47 41 42 4f 52 54  ) sends SIGABORT
37ad0 20 77 69 74 68 20 6f 76 65 72 6c 61 70 70 69 6e   with overlappin
37ae0 67 20 62 75 66 66 65 72 73 20 6f 6e 20 4f 70 65  g buffers on Ope
37af0 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61 73 73 65  nBSD */.    asse
37b00 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a 29 3c 3d  rt( (pSlot+sz)<=
37b10 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
37b20 69 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  i].         || p
37b30 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61 79 2d 3e  Slot>=(pCArray->
37b40 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29 0a 20 20  apCell[i]+sz).  
37b50 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
37b60 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d 65 6d 6d  T_DB );.    memm
37b70 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43 41 72 72  ove(pSlot, pCArr
37b80 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73  ay->apCell[i], s
37b90 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  z);.    put2byte
37ba0 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f  (pCellptr, (pSlo
37bb0 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20  t - aData));.   
37bc0 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a   pCellptr += 2;.
37bd0 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20    }.  *ppData = 
37be0 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20  pData;.  return 
37bf0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  0;.}../*.** Arra
37c00 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
37c10 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
37c20 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
37c30 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
37c40 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68   .** contains th
37c50 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
37c60 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c  of each such cel
37c70 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
37c80 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61   adds the.** spa
37c90 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ce associated wi
37ca0 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20  th each cell in 
37cb0 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20 69  the array that i
37cc0 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  s currently stor
37cd0 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ed .** within th
37ce0 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f  e body of pPg to
37cf0 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69   the pPg free-li
37d00 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69  st. The cell-poi
37d10 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a  nters and other.
37d20 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ** fields of the
37d30 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70   page are not up
37d40 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  dated..**.** Thi
37d50 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
37d60 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
37d70 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64  ber of cells add
37d80 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
37d90 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
37da0 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61 79  nt pageFreeArray
37db0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
37dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37dd0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65      /* Page to e
37de0 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  dit */.  int iFi
37df0 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
37e00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
37e10 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65  t cell to delete
37e20 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
37e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e40 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74        /* Cells t
37e50 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65  o delete */.  Ce
37e60 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79  llArray *pCArray
37e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37e80 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
37e90 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e  */.){.  u8 * con
37ea0 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
37eb0 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f  aData;.  u8 * co
37ec0 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
37ed0 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
37ee0 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20  leSize];.  u8 * 
37ef0 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26  const pStart = &
37f00 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66  aData[pPg->hdrOf
37f10 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e  fset + 8 + pPg->
37f20 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
37f30 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20   int nRet = 0;. 
37f40 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 45   int i;.  int iE
37f50 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43  nd = iFirst + nC
37f60 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65 65  ell;.  u8 *pFree
37f70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72   = 0;.  int szFr
37f80 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  ee = 0;..  for(i
37f90 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b  =iFirst; i<iEnd;
37fa0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
37fb0 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e  Cell = pCArray->
37fc0 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69  apCell[i];.    i
37fd0 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49 4e  f( SQLITE_WITHIN
37fe0 28 70 43 65 6c 6c 2c 20 70 53 74 61 72 74 2c 20  (pCell, pStart, 
37ff0 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 69  pEnd) ){.      i
38000 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 2f 2a 20  nt sz;.      /* 
38010 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73 65 20 63  No need to use c
38020 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 29 20  achedCellSize() 
38030 68 65 72 65 2e 20 20 54 68 65 20 73 69 7a 65 73  here.  The sizes
38040 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 74 68   of all cells th
38050 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20  at.      ** are 
38060 74 6f 20 62 65 20 66 72 65 65 64 20 68 61 76 65  to be freed have
38070 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
38080 6d 70 75 74 69 6e 67 20 77 68 69 6c 65 20 64 65  mputing while de
38090 63 69 64 69 6e 67 20 77 68 69 63 68 0a 20 20 20  ciding which.   
380a0 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e 65 65 64     ** cells need
380b0 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 20 20   freeing */.    
380c0 20 20 73 7a 20 3d 20 70 43 41 72 72 61 79 2d 3e    sz = pCArray->
380d0 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61 73 73 65  szCell[i];  asse
380e0 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20 20 20 20  rt( sz>0 );.    
380f0 20 20 69 66 28 20 70 46 72 65 65 21 3d 28 70 43    if( pFree!=(pC
38100 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20  ell + sz) ){.   
38110 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
38120 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
38130 72 74 28 20 70 46 72 65 65 3e 61 44 61 74 61 20  rt( pFree>aData 
38140 26 26 20 28 70 46 72 65 65 20 2d 20 61 44 61 74  && (pFree - aDat
38150 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
38160 20 20 20 20 20 20 66 72 65 65 53 70 61 63 65 28        freeSpace(
38170 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65 65  pPg, (u16)(pFree
38180 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65   - aData), szFre
38190 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
381a0 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 43        pFree = pC
381b0 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46  ell;.        szF
381c0 72 65 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ree = sz;.      
381d0 20 20 69 66 28 20 70 46 72 65 65 2b 73 7a 3e 70    if( pFree+sz>p
381e0 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  End ) return 0;.
381f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
38200 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 43 65       pFree = pCe
38210 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72  ll;.        szFr
38220 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ee += sz;.      
38230 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a  }.      nRet++;.
38240 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
38250 70 46 72 65 65 20 29 7b 0a 20 20 20 20 61 73 73  pFree ){.    ass
38260 65 72 74 28 20 70 46 72 65 65 3e 61 44 61 74 61  ert( pFree>aData
38270 20 26 26 20 28 70 46 72 65 65 20 2d 20 61 44 61   && (pFree - aDa
38280 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
38290 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
382a0 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44  (u16)(pFree - aD
382b0 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20  ata), szFree);. 
382c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
382d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c  ;.}../*.** apCel
382e0 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
382f0 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
38300 72 73 20 74 6f 20 61 6e 64 20 73 69 7a 65 73 20  rs to and sizes 
38310 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
38320 74 68 65 0a 2a 2a 20 70 61 67 65 73 20 62 65 69  the.** pages bei
38330 6e 67 20 62 61 6c 61 6e 63 65 64 2e 20 20 54 68  ng balanced.  Th
38340 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2c 20  e current page, 
38350 70 50 67 2c 20 68 61 73 20 70 50 67 2d 3e 6e 43  pPg, has pPg->nC
38360 65 6c 6c 20 63 65 6c 6c 73 20 73 74 61 72 74 69  ell cells starti
38370 6e 67 0a 2a 2a 20 77 69 74 68 20 61 70 43 65 6c  ng.** with apCel
38380 6c 5b 69 4f 6c 64 5d 2e 20 20 41 66 74 65 72 20  l[iOld].  After 
38390 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 69 73 20  balancing, this 
383a0 70 61 67 65 20 73 68 6f 75 6c 64 20 68 6f 6c 64  page should hold
383b0 20 6e 4e 65 77 20 63 65 6c 6c 73 0a 2a 2a 20 73   nNew cells.** s
383c0 74 61 72 74 69 6e 67 20 61 74 20 61 70 43 65 6c  tarting at apCel
383d0 6c 5b 69 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54  l[iNew]..**.** T
383e0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
383f0 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
38400 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 70  adjustments to p
38410 50 67 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  Pg so that it co
38420 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f  ntains.** the co
38430 72 72 65 63 74 20 63 65 6c 6c 73 20 61 66 74 65  rrect cells afte
38440 72 20 62 65 69 6e